如何在不同Job构建amd64/arm64镜像并协同推送避免覆盖?
解决GitHub Actions多架构镜像推送覆盖问题
直接推送同一标签的单架构镜像会导致后完成的覆盖先完成的,因为每个单架构镜像的manifest会替换仓库里的同名标签。要避免这个问题,你可以分两步操作:
- 先让两个构建Job分别推送带架构后缀的临时标签镜像
- 新增一个合并Job,等两个构建完成后,创建多架构Manifest并推送到正式标签
修改后的Workflow配置
name: Docker build and publish on: workflow_dispatch: jobs: build_amd64: name: Build amd64 runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.3.0 - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build & push amd64 image uses: docker/build-push-action@v5 with: platforms: linux/amd64 push: true tags: ghcr.io/montejojorge/electrs-ui:latest-amd64 build_arm64: name: Build arm64 runs-on: [self-hosted, linux, ARM64] steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.3.0 - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build & push arm64 image uses: docker/build-push-action@v5 with: platforms: linux/arm64 push: true tags: ghcr.io/montejojorge/electrs-ui:latest-arm64 merge_manifest: name: Merge multi-arch manifest runs-on: ubuntu-latest needs: [build_amd64, build_arm64] steps: - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Create multi-arch manifest run: | docker manifest create ghcr.io/montejojorge/electrs-ui:latest \ --amend ghcr.io/montejojorge/electrs-ui:latest-amd64 \ --amend ghcr.io/montejojorge/electrs-ui:latest-arm64 - name: Annotate manifest (指定架构信息) run: | docker manifest annotate ghcr.io/montejojorge/electrs-ui:latest \ ghcr.io/montejojorge/electrs-ui:latest-arm64 --os linux --arch arm64 - name: Push multi-arch manifest run: docker manifest push ghcr.io/montejojorge/electrs-ui:latest # 可选:删除临时标签的镜像 - name: Clean up temporary images run: | docker manifest rm ghcr.io/montejojorge/electrs-ui:latest-amd64 || true docker manifest rm ghcr.io/montejojorge/electrs-ui:latest-arm64 || true
关键说明
- 每个构建Job推送的是带
-amd64/-arm64后缀的临时标签,不会互相覆盖 merge_manifestJob通过needs字段依赖前两个构建Job,确保只有两个镜像都推送完成后才执行合并- 使用
docker manifest命令将两个单架构镜像合并成多架构镜像,推送到正式的latest标签 - 登录步骤使用GitHub自带的
GITHUB_TOKEN,需要确保仓库的Packages权限已开启
内容的提问来源于stack exchange,提问作者Jorge Montejo
相关产品推荐
相关产品推荐

