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

Pac*_*504 8 docker circleci electron azure-devops azure-pipelines

最近,我的工作场所已从 CircleCI 过渡到 Azure Pipelines,因此我们一直在迁移所有 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

在最后一个脚本期间,任何在没有“apt-get”行的情况下运行脚本的尝试都会失败,并产生错误:退出代码:ENOENT。生成 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?]
Run Code Online (Sandbox Code Playgroud)

错误,并尝试运行“sudo apt-get”给出

/__w/_temp/ac8e299a-ba1c-4e18-8baa-93d3f4a189e3.sh: line 1: sudo: command not found
Run Code Online (Sandbox Code Playgroud)

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

这就造成了无法进行的循环。如何让 apt-get 命令在 Azure Pipelines 中运行?我应该注意到,Mac 版本的运行不需要任何修改或需要 docker 镜像。

Leo*_*SFT 3

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

看来这与 docker 镜像有关。我们知道,Docker 镜像通常没有sudo,我们总是root默认运行。在这种情况下,我们可以直接使用该命令apt-get

但此映像似乎以非 root 身份运行,因此对于 root 访问权限,您必须切换到 root。在 a 中Dockerfile,您可以简单地使用 USER 指令切换用户身份;这通常默认以 root 身份运行:

USER root
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可能需要基于image: electronuserland/builder:wine-03.18.

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

希望这可以帮助。