首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何删除gcloud平台中名为"devops“的存储库中的所有映像

如何删除gcloud平台中名为"devops“的存储库中的所有映像
EN

Stack Overflow用户
提问于 2021-01-03 13:52:00
回答 2查看 499关注 0票数 0

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

代码语言:javascript
运行
复制
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}```
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-06 04:27:57

这是令人困惑的,但是,不同于其他Google平台服务,因为它代表了第三方(Docker)注册表API的实现。

由于这个原因,没有Google (!)的集合。客户端库用于管理容器注册表中的映像,与几乎所有其他gcloud命令不同,gcloud container images命令调用的实现。您可以通过将--log-http附加到gcloud container images命令来观察这一点。

所有这些都是为了说明没有 Google与此服务交互。

另一个奇怪之处是Google平台项目拥有注册中心,但映射并不简单。它通常是gcr.io/${PROJECT},但可以是us.gcr.io/${PROJECT}。下面的脚本假设(!) gcr.io/${PROJECT}

您在问题中包含的代码是bash。本着这种精神(鉴于以上所述),这里有一个脚本,可以满足您的需要。

非常小心,因为如果您包含了delete命令,此脚本将不可逆转地删除除${EXCLUDE}以外的每一个项目中的所有图像。

小心行事

不安全

代码语言:javascript
运行
复制
# 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

非安全

#注释替换为:

代码语言:javascript
运行
复制
gcloud container images delete ${IMAGE} --project=${PROJECT}

最不安全

#注释替换为:

代码语言:javascript
运行
复制
gcloud container images delete ${IMAGE} --project=${PROJECT} --quiet

不那么可怕

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

代码语言:javascript
运行
复制
# Include these projects
PROJECTS=("first" "second" "third")

# Projects accessible to current user
for PROJECT in ${PROJECTS[@]}
do
  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

要重申,请继续小心

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

票数 1
EN

Stack Overflow用户

发布于 2021-01-04 16:37:59

为了澄清一下,我们谈论的是谷歌连续注册中心,而不是谷歌源库。为了管理GCR图像,我建议您使用GCR-清洁剂工具,它根据不同的标准查找和删除旧图像。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65550566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档