【问题标题】:Correct Way To Build Multiple Docker Versions In GitHub Actions?在 GitHub Actions 中构建多个 Docker 版本的正确方法?
【发布时间】:2022-12-03 00:50:57
【问题描述】:

我有一个 GitHub Action,几乎与下面的类似。该操作的目的是构建 Dockerfile 并将其推送到 DockerHub。

name: DockerHub Run
on:
  push:
    branches:
      - "master"
  schedule:
    - cron: "0 0 * * 0"

env:
  DOCKERHUB_USERNAME: MyUser
  OFFICIAL_TAG: MyUser/MyImage:latest
  MAIN_REPO_NAME: MyUser/MyImage
  DOCKERFILE_PATH: /

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ env.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
      - name: Build and push image to DockerHub
        uses: docker/build-push-action@v3
        with:
          platforms: linux/amd64,linux/arm64
          file: ${{ env.GITHUB_WORKSPACE }}/Dockerfile
          push: true
          tags: ${{ env.OFFICIAL_TAG }}
      - name: Update repo description
        uses: peter-evans/dockerhub-description@v2
        with:
          username: ${{ env.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
          repository: ${{ env.MAIN_REPO_NAME }}
          readme-filepath: ./readme.md

根据 DockerHub,列出了架构

但是,我对这一行有疑问:

        uses: docker/build-push-action@v3
        with:
          platforms: linux/amd64,linux/arm64

我不确定此处列出的平台是否真的编译到这些平台。请记住,GitHub 使用的是 ubuntu-latest,它是 x86-x64,我没有要测试的 ARM64 设备。

我是否正确设置以构建 ARM 设备?

【问题讨论】:

标签: docker dockerfile github-actions docker-registry


【解决方案1】:

tldr

我不确定在这里列出平台是否真的编译成那些 平台。

它确实如此(假设您的 Dockerfile 中定义的命令是平台意识的)

我是否正确设置以构建 ARM 设备?

您的配置看起来正确并且应该为 amd64 和 arm64 构建。您可以通过在推送后添加一个步骤并检查输出来进行测试:

# assuming your image is debian based
$ docker run 
  --platform linux/amd64 
  --rm 
  --entrypoint='' 
  MyUser/MyImage:latest 
  /bin/bash -c 'dpkg --print-architecture'

#output should be
amd64

$ docker run 
  --platform linux/arm64 
  --rm 
  --entrypoint='' 
  MyUser/MyImage:latest 
  /bin/bash -c 'dpkg --print-architecture'

#output should be
arm64

长答案

它“有效”是因为 qemu 模拟器适用于许多不同的平台(又名docker/setup-qemu-action@v2),然后使用 docker buildx 用于multi-platform images

问题是,即使一切似乎都以这种方式在 CI 中构建得很好,但工件从未真正在各自的本机平台上得到测试,所以要回答你的问题“我是否正确设置以构建到 ARM 设备?” ...?‍♂️

我发现它类似于 python 及其 universal2 wheels,其中构建了交叉编译,但从未真正测试过(所有这些都是 python 和 macos 特定的,但对话指出了对这些多平台工件运行集成/e2e 测试的挑战):

这个 github/community 讨论还提供了一个小的更深入地了解多平台构建 https://github.com/community/community/discussions/38728#discussioncomment-4106829

【讨论】: