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

如何将无标签镜像删除集成至DockerHub自动化清理工作流?

解决方案:在CI/CD清理工作流中直接清理DockerHub无标签镜像

核心结论

完全可以在清理工作流中集成无标签镜像的清理逻辑,无需依赖DockerHub的自动垃圾回收。通过DockerHub官方API,你可以主动识别并删除无标签镜像的manifest,再手动触发垃圾回收,快速清理无主Blob。

具体实现步骤

1. 准备DockerHub访问令牌

在DockerHub账号的「Settings > Security」页面创建个人访问令牌(PAT),确保令牌拥有目标仓库的write或admin权限。

2. 识别无标签镜像的Manifest

通过DockerHub API获取仓库所有manifest,过滤出未关联任何标签的条目:

# 替换为你的信息
export DOCKERHUB_PAT="你的令牌"
export DOCKERHUB_USER="你的用户名"
export DOCKERHUB_REPO="你的仓库名"

# 获取仓库所有manifest(分页需自行处理,示例取前1000条)
MANIFESTS=$(curl -s -H "Authorization: Bearer $DOCKERHUB_PAT" \
  "https://hub.docker.com/v2/repositories/$DOCKERHUB_USER/$DOCKERHUB_REPO/manifests/?page_size=1000")

# 提取无标签的manifest digest(需提前安装jq)
UNTAGGED_DIGESTS=$(echo $MANIFESTS | jq -r '.results[] | select(.tags | length == 0) | .digest')

3. 删除无标签镜像的Manifest

遍历识别出的digest,调用API删除对应的manifest:

for DIGEST in $UNTAGGED_DIGESTS; do
  echo "删除无标签镜像manifest: $DIGEST"
  curl -X DELETE -H "Authorization: Bearer $DOCKERHUB_PAT" \
    "https://hub.docker.com/v2/repositories/$DOCKERHUB_USER/$DOCKERHUB_REPO/manifests/$DIGEST"
done

4. 手动触发仓库垃圾回收

删除manifest后,手动触发DockerHub的垃圾回收,立即清理无主Blob:

echo "触发DockerHub垃圾回收"
curl -X POST -H "Authorization: Bearer $DOCKERHUB_PAT" \
  "https://hub.docker.com/v2/repositories/$DOCKERHUB_USER/$DOCKERHUB_REPO/gc/"

5. 集成到CI/CD工作流

将上述脚本整合到你的定时清理工作流中,以GitHub Actions为例:

jobs:
  dockerhub-cleanup:
    runs-on: ubuntu-latest
    steps:
      - name: 清理无标签镜像并触发GC
        env:
          DOCKERHUB_PAT: ${{ secrets.DOCKERHUB_PAT }}
          DOCKERHUB_USER: "你的用户名"
          DOCKERHUB_REPO: "你的仓库名"
        run: |
          # 安装jq
          sudo apt-get update && sudo apt-get install -y jq

          # 获取无标签manifest digest
          MANIFESTS=$(curl -s -H "Authorization: Bearer $DOCKERHUB_PAT" \
            "https://hub.docker.com/v2/repositories/$DOCKERHUB_USER/$DOCKERHUB_REPO/manifests/?page_size=1000")
          UNTAGGED_DIGESTS=$(echo $MANIFESTS | jq -r '.results[] | select(.tags | length == 0) | .digest')

          # 删除无标签manifest
          for DIGEST in $UNTAGGED_DIGESTS; do
            curl -X DELETE -H "Authorization: Bearer $DOCKERHUB_PAT" \
              "https://hub.docker.com/v2/repositories/$DOCKERHUB_USER/$DOCKERHUB_REPO/manifests/$DIGEST"
          done

          # 触发垃圾回收
          curl -X POST -H "Authorization: Bearer $DOCKERHUB_PAT" \
            "https://hub.docker.com/v2/repositories/$DOCKERHUB_USER/$DOCKERHUB_REPO/gc/"

注意事项

  • 若仓库manifest数量超过1000,需处理API分页逻辑(通过返回结果的next字段循环获取)。
  • 垃圾回收触发后,DockerHub可能需要1-5分钟完成Blob清理,并非即时生效,但远快于自动GC的定时周期。
  • 操作前建议先测试API调用,避免误删有效镜像。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:12:36