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

如何彻底删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:48:29