当我们使用相同的图像名称和版本(标记)反复推入gcr.io
时,会出现大量未标记的图像。
是否有一种简单的方法可以从项目中删除所有未标记的图像,或者至少删除单个图像,以避免产生存储成本?
答案 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)
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)
以前的单行代码对我不起作用。我目前正在使用此
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
希望对某人有帮助