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

如何在Github Actions中基于镜像内容哈希打标签并推送至镜像仓库?

用镜像内容哈希作为标签推送至镜像仓库(Github Action实现)

核心思路

Docker镜像的Digest是基于镜像所有层内容计算出的唯一哈希值,只要镜像内容完全一致,Digest就会保持相同。我们可以提取这个Digest作为镜像标签,实现相同内容镜像标签一致的需求。

具体实现步骤(Github Action)

1. 登录目标镜像仓库

先完成仓库登录,确保Action拥有推送镜像的权限。

2. 构建临时镜像

先给镜像打一个临时标签,方便后续获取Digest。

3. 提取内容哈希(Digest)

通过docker inspect命令获取镜像的RepoDigests字段,从中提取出内容哈希值。

4. 为镜像打上哈希标签

用提取到的哈希值作为新标签,重新标记临时镜像。

5. 推送带哈希标签的镜像

将打好标签的镜像推送到仓库,可选同时推送latest标签。

完整Workflow示例

name: Build & Push Image with Content Hash Tag

on:
  push:
    branches: [ main ]

jobs:
  build-push:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Log in to GHCR
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build temporary image
        run: |
          docker build -t ghcr.io/${{ github.repository }}:temp .

      - name: Extract content hash (Digest)
        id: extract-hash
        run: |
          # 获取完整RepoDigest格式:<仓库地址>@sha256:<哈希值>
          FULL_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' ghcr.io/${{ github.repository }}:temp)
          # 提取哈希部分(可选择保留sha256:前缀或仅取哈希字符串)
          HASH_TAG=${FULL_DIGEST#*@}
          # 将哈希值输出为Action变量
          echo "hash_tag=$HASH_TAG" >> $GITHUB_OUTPUT

      - name: Tag image with content hash
        run: |
          docker tag ghcr.io/${{ github.repository }}:temp ghcr.io/${{ github.repository }}:${{ steps.extract-hash.outputs.hash_tag }}

      - name: Push images
        run: |
          # 推送带哈希标签的镜像
          docker push ghcr.io/${{ github.repository }}:${{ steps.extract-hash.outputs.hash_tag }}
          # 可选:推送latest标签
          docker tag ghcr.io/${{ github.repository }}:temp ghcr.io/${{ github.repository }}:latest
          docker push ghcr.io/${{ github.repository }}:latest

注意事项

  • 如果使用Docker Hub,只需修改registry为docker.io,并在Secrets中配置Docker Hub的用户名和密码。
  • 若要仅使用哈希字符串作为标签(不带sha256:前缀),可修改提取命令为:HASH_TAG=$(echo $FULL_DIGEST | awk -F'[@:]' '{print $3}')。
  • 确保构建上下文完全一致:不要在镜像中包含动态生成的文件(如带时间戳的日志、临时文件),否则即使代码相同,镜像内容也会变化,哈希值随之改变。

内容的提问来源于stack exchange,提问作者atomkirk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:30:26