0

我正在测试一个 GitHub 工作流,该工作流检查代码是否在 arm64 上编译,使用 Linux/aarch64 Docker 容器进行构建。我知道 GitHub 容器仅适用于 x86,但是我想知道是否可以在 GitHub 管理的工作流上的 docker 中执行多架构图像。

细节

在 GitHub 上执行 CI 作业并且容器初始化正常:https ://github.com/facebookincubator/hsthrift/runs/4835956150?check_suite_focus=true#step:2:14

  /usr/bin/docker pull ghcr.io/donsbot/hsthrift/ci-base:ghcup-arm64v8
  ghcup-arm64v8: Pulling from donsbot/hsthrift/ci-base
...
  Digest: sha256:4c09341793d78efb74ad751b55152637d00b6297049458923825368fffb5485d
  Status: Downloaded newer image for ghcr.io/donsbot/hsthrift/ci-base:ghcup-arm64v8
  ghcr.io/donsbot/hsthrift/ci-base:ghcup-arm64v8

  /usr/bin/docker create .. --cpus 2 ... --entrypoint "tail" ghcr.io/donsbot/hsthrift/ci-base:ghcup-arm64v8 "-f" "/dev/null"
  a63c28c54f278781f85a4ca85e3b1f5c3dd7c0d6b125fbcfd0e1d2f57ad0b0ef

  /usr/bin/docker start a63c28c54f278781f85a4ca85e3b1f5c3dd7c0d6b125fbcfd0e1d2f57ad0b0ef
  a63c28c54f278781f85a4ca85e3b1f5c3dd7c0d6b125fbcfd0e1d2f57ad0b0ef

  /usr/bin/docker ps --all --filter id=a63c28c54f278781f85a4ca85e3b1f5c3dd7c0d6b125fbcfd0e1d2f57ad0b0ef --filter status=running --no-trunc --format "{{.ID}} {{.Status}}"
  a63c28c54f278781f85a4ca85e3b1f5c3dd7c0d6b125fbcfd0e1d2f57ad0b0ef Up Less than a second

  /usr/bin/docker inspect --format "{{range .Config.Env}}{{println .}}{{end}}" a63c28c54f278781f85a4ca85e3b1f5c3dd7c0d6b125fbcfd0e1d2f57ad0b0ef
  CI=true
  HOME=/github/home
  GITHUB_ACTIONS=true
  PATH=/root/.ghcup/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  TZ=Europe/London
  LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/x86_64-linux-gnu:

所以一切看起来都很好,很开心。但由于 VM 未运行,该作业在第一个 exec 步骤中失败。

来自守护程序的错误响应:容器 a63c28c54f278781f85a4ca85e3b1f5c3dd7c0d6b125fbcfd0e1d2f57ad0b0ef 未运行

这可以在各种主机上本地成功运行。

问题

  • 我怎样才能在这里调试容器发生了什么?
  • GitHub 上的 x86 Docker 容器通常支持多架构图像吗?(其他例子)

相关工作

4

1 回答 1

1

这个缺失的部分是标准 GitHub 'container' docker 引擎中的多架构支持。

我们可以在新的 docker 容器中手动调用交叉编译步骤,而不是使用“容器”方法。这是由 run-on-arch-action 自动完成的,它负责让 qemu 和 docker 进入正确的状态。

docker run --rm --privileged multiarch/qemu-user-static --reset -p 是

https://github.com/uraimo/run-on-arch-action

在非 x86 上构建的 yml 文件现在看起来像:

 build-on-aarch64:
    runs-on: ubuntu-latest
    name: ci (arm64)
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Build in arm64 container
        uses: uraimo/run-on-arch-action@v2.1.1
        with:
          arch: aarch64
          distro: ubuntu20.04
          # Install deps into the container. With the token, the container will be cached
          # The image is cached publically like a package
          githubToken: ${{ github.token }}
          install: |
             .. install packages for the arm container (e.g. Dockerfile steps)
          run: |
             .. run build steps on the container

这个动作本质上为我们构建了 Docker 镜像,设置了 qemu,负责缓存它,并使用 GitHub 运行器主机的正确仿真运行它。

于 2022-01-18T00:54:24.090 回答