我有删除存储库中的所有图像的代码,除了最新的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}```发布于 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}以外的每一个项目中的所有图像。
小心行事
不安全
# 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不那么可怕
如果为脚本提供希望包含在清除中的项目(存储库)列表,风险会更小。但是,这个剧本仍然很危险:
# 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要重申,请继续小心
删除图像是不可撤销的,您将无法恢复已删除的图像
https://stackoverflow.com/questions/65550566
复制相似问题