当前位置: 首页 > 知识库问答 >
问题:

在Azure管道中的Docker映像中运行apt-get

魏硕
2023-03-14

最近,我的工作场所一直在从CircleCI过渡到Azure管道,因此我们一直在迁移我们所有的CI。虽然大多数人都有些直截了当,但这种特殊的管道需要在docker映像中运行我们的linux作业。以下是CircleCI中的内容:

build:
    docker:
      - image: electronuserland/builder:wine-03.18
      
    steps:
      - run: apt-get update
      - run: apt-get install -y libgnome-keyring-dev icnsutils graphicsmagick xz-utils rpm bsdtar
      - run: yarn install

      # run tests!
      - run: yarn test -- -u
      - run: yarn test -- --maxWorkers 2

      # Build the React app and the Electron app
      - run:
          name: yarn run electron-pack
            VERSION=$(node -p "var ipVer = require('./package.json').version; \
                                             var semVer = require('semver'); \
                                             var sprintf = require('sprintf-js').sprintf; \
                                             sprintf('%s.%s.%s%s', semVer.major(ipVer), semVer.minor(ipVer), semVer.patch(ipVer), '$ReleaseVAR');")
            yarn version --no-git-tag-version --new-version VERSION
            yarn run electron-pack

      # Move the packages into a separate directory
      - run: mkdir dist/packages
      - run: mv dist/*.exe dist/packages
      - run: mv dist/*.AppImage dist/packages
      - run: mv dist/*.deb dist/packages
      - run: mv dist/*.rpm dist/packages

这是它目前在Azure管道中的样子:

jobs:
  - job: Linux
    pool:
      name: 'Hosted Ubuntu 1604'
      vmImage: 'ubuntu-16.04'
    container:
      image: electronuserland/builder:wine-03.18
      options: --privileged
    
    steps:
      - task: NodeTool@0
        inputs:
          versionSpec: '8.x'
        displayName: 'Install Node.js'
      #- script: apt-get update
      #  displayName: apt-get update
      #- script: sudo apt-get install -y libgnome-keyring-dev icnsutils graphicsmagick xz-utils rpm bsdtar
      #  displayName: apt-get install
      #- script: sudo apt-get -f install
      #- script: sudo apt-get install -y wine
      - task: Npm@1
        inputs:
          command: 'install'
      - script: yarn test -- -u --coverage
        displayName: yarn -u
      - script: yarn test -- --maxWorkers 2 --coverage
        displayName: yarn maxWorkers 2

      - script: |
          VER=$(node -p "var ipVer = require('./package.json').version; \
                                                var semVer = require('semver'); \
                                                var sprintf = require('sprintf-js').sprintf; \
                                                sprintf('%s.%s.%s%s', semVer.major(ipVer), semVer.minor(ipVer), semVer.patch(ipVer), '$(Build.BuildNumber)');")
                yarn version --no-git-tag-version --new-version $(VER)
                yarn run electron-pack

在最后一个脚本期间,任何尝试运行没有“apt-get”行的脚本都会失败,从而产生错误:退出代码:ENOENT。spawn icns2png ENOENT错误。尝试运行这些行,会给出一个

E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?]

错误,并尝试运行'sudo apt-get'会给出

/__w/_temp/ac8e299a-ba1c-4e18-8baa-93d3f4a189e3.sh: line 1: sudo: command not found

错误。但是要安装sudo,我需要能够运行“apt-get install sudo-y”

这会导致无法继续循环。如何让apt get命令在Azure管道内运行?我应该注意到,这个版本的Mac版运行时不需要任何修改,也不需要docker映像。

共有1个答案

蒯安平
2023-03-14

如何让apt-get命令在Azure管道中运行?

这似乎与docker映像有关。众所周知,Docker映像通常没有sudo,默认情况下我们总是作为root运行。在这种情况下,我们可以直接使用命令apt-get

但这个映像似乎是以非根的方式运行的,所以对于根访问,您必须切换到根。在Dockerfile中,您可以简单地使用用户指令切换用户身份;这通常默认为以root身份运行:

USER root

要解决此问题,您可能需要根据图像:electronuserland/builder:wine-03.18自定义docker图像。

您可以尝试检查此线程以了解更多详细信息。

希望这有帮助。

 类似资料:
  • 我有一个简单的Jenkins管道,它创建了一个包含3个容器的pod——jnlp、dind和示例测试 如下所示- 还定义了几个阶段- 现在我的根文件夹中有了这个脚本“示例”,我想运行它,但不知怎么的,它找不到。 Dockerfile看起来像这样- pwd返回“/home/jenkins/agent/workspace/test pipeline”,而不是docker容器路径。 结果如下- 你知道怎么

  • Azure文档(https://docs.microsoft.com/en-us/Azure/devops/pipelines/tasks/build/docker?view=azure-devops)没有指定如何在Azure pipeline中运行docker容器。我们可以使用docker@2任务来构建/推送docker图像,但它没有运行容器的命令。通过查看旧版本Docker task的源代码,

  • 我想把我的形象推广到Docker Hub。这项任务似乎很简单,但我对细节一无所知。 变量的值应该是什么,以及如何构造它?这些说明似乎可以解释,但我不明白。

  • 问题内容: 我已经尝试过将docker和jenkins一起使用,两者都安装在我的机器上(w10),并且我使用jankins运行docker镜像。但是,当我按照jenkins文档中的示例(来自doc的示例)时,它不起作用。不涉及时,不同的管道脚本可以工作,我还尝试从jenkins config接口添加。 管道脚本 错误堆栈 我在SO上发现了类似的问题\(相同但没有明确的解决方案) 问题答案: 您的工

  • 问题内容: 我使用Java创建了一个Docker映像,并将jar文件复制到该映像中。我的Dockerfile是: 执行以下命令后: 在控制台中,我看到了应用程序的输出,一切都很好。但是当我停止图像时,我不知道如何再次运行图像?当我执行以下命令时: 该应用程序再次运行,但是在我的Dockerfile中,我已经编写了此命令。如何在不使用此命令的情况下运行映像并使应用程序自动运行? 问题答案: 图像和容

  • 问题内容: 我想在Docker容器中运行Jenkins。一切都好。我可以这样运行:我也可以添加持久性存储。当我创建管道必须执行命令(和)时,问题就来了。首先,错误是未在系统上安装docker。是的,期望。然后我开始搜索,发现如何在容器中运行docker(传递2个持久卷): 这可以运行,但是有一些例外。容器中有命令,但是当我尝试运行它时,它将引发异常: 我该如何解决这个问题?在Docker中安装Je