在GitHub操作中构建多个Docker版本的正确方法?

yzxexxkh  于 2022-12-03  发布在  Docker
关注(0)|答案(1)|浏览(133)

我有一个GitHub操作,它几乎和下面的一样。这个操作的目的是建立一个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,该体系结构被列为x1c 0d1x
不过,我对这一行有个疑问:

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

我不确定这里列出的平台是否真的编译到这些平台上。请记住,GitHub使用的是ubuntu-latest,即x86-x64,我没有ARM 64设备要测试。
我的设置是否正确,可以构建到ARM设备?

polhcujo

polhcujo1#

tldr

我不确定这里列出的平台是否真的编译到这些平台。
确实如此(假设您在Dockerfile中定义的命令是平台感知的)
我的设置是否正确,可以构建到ARM设备?
您的配置看起来是正确的,应该是针对amd 64和arm 64构建的。您可以通过在推送后添加一个步骤并检查输出来进行测试:

# 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的仿真器适用于一系列不同的平台(aka docker/setup-qemu-action@v2),然后使用docker buildx实现multi-platform images
问题是,即使一切似乎建立良好的CI这种方式,工件从来没有真正得到测试,在各自的本地平台,所以回答你的问题'我设置正确,以建立到ARM设备?'..🤷‍ ♂️
我发现它类似于python及其universal 2 wheels,其中构建了交叉编译,但从未真正进行过测试(所有这些都是python和macos特有的,但对话指出了为这些多平台工件运行集成/e2 e测试的挑战):

这个github/社区讨论还提供了更多关于多平台构建的深度信息https://github.com/community/community/discussions/38728#discussioncomment-4106829

相关问题