You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不同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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:20:04