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

时间:2017-09-27 14:59:14

标签: google-cloud-platform google-container-registry

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

7 个答案:

答案 0 :(得分:8)

gcloud container images list-tags gcr.io/project-id/repository --format=json --limit=unlimited将为您提供一个易于消费的json blob信息,用于回购中的图像(例如带有相关标签的摘要)。

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

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

答案 1 :(得分:3)

使用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}@" $1}' | xargs gcloud container images delete --quiet

答案 2 :(得分:1)

已记录为 here ,但要注意的一件事是

  

DIGEST必须采用“ 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......].

答案 3 :(得分:1)

由@Benos发布的一种衬垫的

Powershell 版本

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:*'以删除某个图像的所有标签(这是我试图完成的工作)

答案 4 :(得分:0)

以前的单行代码对我不起作用。我目前正在使用此

  • 删除给定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

答案 5 :(得分:0)

更正的 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 }

答案 6 :(得分:-1)

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

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

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

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

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

希望对某人有帮助