如何将无标签镜像删除集成至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
相关产品推荐
相关产品推荐

