如何在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
相关产品推荐
相关产品推荐

