删除 Google Cloud Registry 上未标记的图像

Delete untagged images on Google Cloud Registry

当我们使用相同的图像名称和版本(标签)重复推送到 gcr.io 时,会出现大量未标记的图像。
是否有一种简单的方法可以从项目中删除所有未标记的图像,或者至少删除单个图像,以避免产生存储成本?

gcloud container images list-tags gcr.io/project-id/repository --format=json --limit=unlimited 将为您提供易于使用的 json 存储库中图像的信息块(例如带有相关标签的摘要)。

为了只是枚举所有缺少标签的摘要:

gcloud container images list-tags gcr.io/project-id/repository --filter='-tags:*' --format='get(digest)' --limit=unlimited

您可以迭代并删除: gcloud container images delete --quiet gcr.io/project-id/repository@DIGEST

当你用 awk 和 xargs 将它们粘在一起时很方便

gcloud container images list-tags gcr.io/${PROJECT_ID}/${IMAGE} --filter='-tags:*' --format='get(digest)' --limit=unlimited | awk '{print "gcr.io/${PROJECT_ID}/${IMAGE}@" }' | xargs gcloud container images delete --quiet

我的用例是从特定项目中删除所有未标记的图像。我写了简单的脚本来实现这个:

delete_untagged() {
    echo "   |-Deleting untagged images for "
    while read digest; do
       gcloud container images delete @$digest --quiet 2>&1 | sed 's/^/        /'
    done < <(gcloud container images list-tags  --filter='-tags:*' --format='get(digest)' --limit=unlimited)
}

delete_for_each_repo() {
    echo "|-Will delete all untagged images in "
    while read repo; do
        delete_untagged $repo
    done < <(gcloud container images list --repository  --format="value(name)")
}

delete_for_each_repo gcr.io/<project-id>/<repository>

完整的脚本可以在这里找到:https://gist.github.com/lahsivjar/2b011d69368a26af7043d4aa70ec78f8

希望对大家有所帮助

已记录 here 但需要注意的一件重要事情是

DIGEST must be of the form "sha256:<digest>"

所以首先捕捉未标记图像的形式sha256:<digest>

$ DIGEST=`gcloud container images list-tags gcr.io/[PROJECT-ID]/[IMAGE] \
--filter='-tags:*' --format='get(digest)'`
$ echo $DIGEST
sha256:7c077a9ca45aea7134d8436a3071aceb5fa62758cc86eadec63f02692b7875f7

然后用变量去掉

$ gcloud container images delete --quiet gcr.io/[PROJECT-ID]/[IMAGE]@$DIGEST
Digests:
- gcr.io/[PROJECT-ID]/[IMAGE]@sha256:7c077a9ca45a......
Deleted [gcr.io/[PROJECT-ID]/[IMAGE]@sha256:7c077a9ca45a......].

以前的单线对我不起作用。我现在正在用这个

  • 删除给定 PROJECT_ID 和 IMAGE
  • 的所有未标记图像
  • 使用创建令牌的 Xargs -I(在本例中称为 {arg})
gcloud container images list-tags gcr.io/${PROJECT_ID}/${IMAGE} --filter='-tags:*' --format='get(digest)' --limit=unlimited | xargs -I {arg} gcloud container images delete  "gcr.io/${PROJECT_ID}/${IMAGE}@{arg}" --quiet

Powershell 由 @Benos

发布的 one liner 版本
gcloud container images list-tags gcr.io/myprojectname/myimagename --filter='-tags:*' --format='get(tags)' --limit=unlimited | ForEach-Object { gcloud container images delete "gcr.io/myprojectname/myimagename:$PSItem" --quiet } 

删除 --filter='-tags:*' 以删除某个图像的所有标签(这是我试图完成的)

更正了 Powershell 命令

gcloud container images list-tags gcr.io/myprojectname/myimagename --filter='-tags:*' --format='get(digest)' --limit=unlimited | ForEach-Object { gcloud container images delete "gcr.io/myprojectname/myimagename@$PSItem" --quiet }