如何删除所有存储库中的所有图像,但 gcloud 平台中名为“devops”的存储库除外 不安全不安全最不安全不那么可怕

问题描述

我有删除存储库中除最新 6 个图像之外的所有图像的代码,但我想将脚本提升到下一个级别,删除存储库中除名为“devops”的存储库之外的所有图像..

IFS=$'\n\t'
set -eou pipefail

if [[ "$#" -ne 2 || "${1}" == '-h' || "${1}" == '--help' ]]; then
    cat >&2 <<"EOF"

EOF
    exit 1
# elif [ ${2} -ge 0 ] 2>/dev/null; then
#     echo "no number of images to remain given" >&2
#     exit 1
fi

main() {
    local C=0
    IMAGE="${1}"
    NUMBER_OF_IMAGES_TO_REMAIN=$((${2} - 1))

    DATE=$(gcloud container images list-tags $IMAGE --limit=unlimited \
        --sort-by=~TIMESTAMP --format=json | TZ=/usr/share/zoneinfo/UTC jq -r '.['$NUMBER_OF_IMAGES_TO_REMAIN'].timestamp.datetime | sub("(?<before>.*):"; .before ) | strptime("%Y-%m-%d %H:%M:%s%z") | mktime | strftime("%Y-%m-%d")')

    for digest in $(gcloud container images list-tags $IMAGE --limit=unlimited --sort-by=~TIMESTAMP \
        --filter="timestamp.datetime < '${DATE}'" --format='get(digest)'); do
        (
            set -x
            gcloud container images delete -q --force-delete-tags "${IMAGE}@${digest}"
        )
        let C=C+1
    done
    echo "Deleted ${C} images in ${IMAGE}." >&2
}

main "${1}" ${2}```

解决方法

令人困惑,但 Google Container Registry 与其他 Google Cloud Platform 服务的不同之处在于它代表了 3rd-party (Docker) Registry API 的实现。

因此,没有一套 Google (!) 客户端库用于管理 Container Registry 中的映像,并且与几乎所有其他 gcloud 命令不同,gcloud container images 命令调用 Google 的 Docker Registry API 实现.您可以通过将 --log-http 附加到 gcloud container images 命令来观察这一点。

所有这些都是为了说明没有用于与此服务交互的 Google Python SDK。

另一个怪癖是 Google Cloud Platform 项目拥有 Google Container Registry 注册表,但映射很重要。它通常是 gcr.io/${PROJECT},但也可以是 us.gcr.io/${PROJECT}。以下脚本假定 (!) gcr.io/${PROJECT}

您在问题中包含的代码是 bash。本着这种精神(并考虑到上述情况),这里有一个脚本可以满足您的需求。

非常小心,因为如果您包含删除命令,此脚本将不可撤销地删除每个项目中的所有图像,除了{{ 1}}

谨慎行事

不安全

${EXCLUDE}

不安全

# Exclude this project EXCLUDE="devops" PROJECTS=$(gcloud projects list --format="value(projectId)") # Projects accessible to current user for PROJECT in ${PROJECTS} do printf "Project: %s\n" ${PROJECT} if [ "${PROJECT}" == "${EXCLUDE}" ] then printf "Excluding Repository: %s\n" ${PROJECT} else printf "Including Repository: %s\n" ${PROJECT} # Images in ${PROJECT} repository IMAGES=$(gcloud container images list --project=${PROJECT}) for IMAGE in ${IMAGES} do printf "Deleting Image: %s\n" ${IMAGE} # Image delete command goes here done fi done 注释替换为:

#

最不安全

gcloud container images delete ${IMAGE} --project=${PROJECT} 注释替换为:

#

不那么可怕

为脚本提供您希望包含在清除中的项目(存储库)列表的风险较小。但是,这个脚本仍然很危险:

gcloud container images delete ${IMAGE} --project=${PROJECT} --quiet

重申请谨慎行事

删除图像不可撤销,您将无法恢复已删除的图像

,

只是为了澄清我们在谈论 Google Continaer Registry 而不是 Google Source Repository。为了管理 GCR 图像,我建议您使用 GCR-cleaner 工具,它可以根据不同的 criteria 查找和删除旧图像。