如何彻底删除Google Artifacts Registry指定标签的镜像?
关于GCP Artifacts Registry镜像清理的问题
背景:GitHub Actions推送镜像流程
我目前通过GitHub Actions将镜像构建并推送到GCP Artifacts Registry,流程如下:
- name: Authenticate to Google Cloud id: auth uses: google-github-actions/auth@v1 with: credentials_json: ${{ secrets.GOOGLE_CREDENTIALS }} - name: Configure Docker to use gcloud for auth run: gcloud --quiet auth configure-docker ... - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build and push image uses: docker/build-push-action@v5 with: context: . build-args: | PYPI_USERNAME=${{ secrets.PYPI_USERNAME }} PYPI_PASSWORD=${{ secrets.PYPI_PASSWORD }} push: true tags: "${{ env.DOCKER_IMAGE }}:${{ github.sha }}" cache-from: type=gha,scope=${{ env.DOCKER_IMAGE }} cache-to: type=gha,mode=max,scope=${{ env.DOCKER_IMAGE }}
镜像以提交的SHA作为标签,现在想定期比对GKE集群在用镜像和注册表镜像,清理未使用的镜像,已经能通过以下命令获取镜像列表:
- 注册表镜像列表:
gcloud artifacts docker images list us-docker.pkg.dev/PROJECT_ID/gcr.io --include-tags - GKE集群在用镜像:
kubectl get pods --all-namespaces -o jsonpath="{..image}"
疑问解答
1. 注册表中的无标签镜像是什么?
无标签镜像是指镜像manifest没有关联任何标签的实例,常见场景包括:
- 推送新标签覆盖旧标签时,旧标签对应的manifest会失去标签关联,变成无标签状态
- 手动删除标签后,对应的manifest不会自动删除,留下无标签镜像
- 构建过程中生成的未打标签就推送的镜像或中间层
2. 为何带标签的镜像不显示大小?
gcloud artifacts docker images list默认只展示仓库和标签信息,要查看带标签镜像的大小,需要指定输出格式:
gcloud artifacts docker images list us-docker.pkg.dev/PROJECT_ID/gcr.io --include-tags --format="table(name, tags, size)"
执行后就能看到每个标签对应的镜像大小。
核心问题:彻底删除指定标签关联镜像的正确命令
直接按标签删除只会移除标签指向,不会删除底层的manifest和镜像层,所以要分两步操作:
步骤1:删除目标标签
先移除指定标签的关联:
gcloud artifacts docker images delete us-docker.pkg.dev/PROJECT_ID/gcr.io/[你的镜像名]:[目标标签] --quiet
--quiet参数用于跳过确认提示,适合自动化脚本场景。
步骤2:清理无标签的manifest(清除残留)
删除标签后,对应的manifest会变成无标签状态,需要清理这些无引用的对象,连带未被使用的镜像层一起删除:
如果要批量清理所有无标签镜像,用这条命令:
gcloud artifacts docker images list us-docker.pkg.dev/PROJECT_ID/gcr.io --include-tags=false --format="get(name@digest)" | xargs -I {} gcloud artifacts docker images delete {} --quiet
这条命令会先列出所有无标签镜像,再逐个删除它们的manifest,GCP会自动清理没有任何manifest引用的镜像层。
注意事项
- 清理前务必确认目标镜像没有被GKE集群或其他服务使用,避免业务故障
- 自动化脚本运行前,建议先去掉
--quiet和xargs部分,手动确认要删除的对象 - 批量清理未使用镜像时,可先收集集群未使用的标签列表,逐个删除标签后,再执行无标签镜像清理命令
内容的提问来源于stack exchange,提问作者Enirsa
相关产品推荐
相关产品推荐

