Когда мы многократно нажимаем на gcr.io
с тем же именем изображения и версией (тегом), появляется большое количество немаркированных изображений.
Есть ли простой способ удалить все немаркированные изображения из проекта или хотя бы для одного изображение, чтобы избежать затрат на хранение?
Удалите немаркированные изображения из Google Cloud Registry
Ответы (7)
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
Удобно, когда вы склеиваете их с помощью 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
Предыдущий однострочник у меня не работал. Я использую это сейчас
- Удалить все изображения без тегов для заданных 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
Моим вариантом использования было удаление всех немаркированных изображений из определенного проекта. Для этого я написал простой скрипт:
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/2b011d7043d68a1 >
Надеюсь, это будет кому-то полезно
Это задокументировано здесь, но следует отметить одну важную вещь:
ДАЙДЖЕСТ должен иметь форму «
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......].
Powershell версии одного лайнера, размещенного @Benos
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 }