我正在尝试编写清理脚本。该脚本应该删除旧的ACR图像。这是在詹金斯运行的sh命令:
ACRS=( mydevacr )
for ACR in "\${ACRS[@]}"
do
readarray -t repos < <(az acr repository list --name \$ACR | jq -cr '.[]')
for imageName in "\${repos[@]}"; do
readarray -t tags < <(az acr repository show-tags -n \$ACR --repository \$imageName --orderby time_desc | jq -cr '.[]')
for tag in "\${tags[@]:30}"
do
az acr repository delete -n \$ACR --image "\$imageName:\$tag" --yes
done
done
done
它按预期运行了一段时间,但随后,如此处所示,发生了无法解释的事情。另外,它作为Jenkins管道运行,因此,我必须转义$,以便Groovy不会尝试处理它们。
+ for tag in "${tags[@]:30}"
+ az acr repository delete -n mydevacr --image frontend-dev:606 --yes
WARNING: This operation will delete the manifest 'sha256:44355fdb6becffc44d2cc6a4f3d00d9d7963bf00fbe4375e' and all the following images: 'frontend-dev:606'
+ for tag in "${tags[@]:30}"
+ az acr repository delete -n mydevacr --image frontend-dev:605 --yes
WARNING: This operation will delete the manifest 'sha256:8e48ac6c8b51458b4846c10b01260d74cbb11ac3c7f52c5' and all the following images: 'frontend-dev:605'
+ for tag in "${tags[@]:30}"
+ az acr repository delete -n mydevacr --image frontend-dev:604 --yes
WARNING: This operation will delete the manifest 'sha256:2b443ff1da9604b4b4a3b1831095375b6fd72c19c39e2e93'
and all the following images: 'frontend-dev:525', 'frontend-dev:526', 'frontend-dev:527',
'frontend-dev:528', 'frontend-dev:529', 'frontend-dev:530', 'frontend-dev:531', 'frontend-dev:533',
'frontend-dev:534', 'frontend-dev:535', 'frontend-dev:536', 'frontend-dev:537', 'frontend-dev:538',
'frontend-dev:539', 'frontend-dev:540', 'frontend-dev:542', 'frontend-dev:545', 'frontend-dev:547',
'frontend-dev:549', 'frontend-dev:550', 'frontend-dev:551', 'frontend-dev:555', 'frontend-dev:556',
'frontend-dev:557', 'frontend-dev:558', 'frontend-dev:559', 'frontend-dev:560', 'frontend-dev:561',
'frontend-dev:562', 'frontend-dev:563', 'frontend-dev:565', 'frontend-dev:566', 'frontend-dev:569',
'frontend-dev:571', 'frontend-dev:572', 'frontend-dev:574', 'frontend-dev:575', 'frontend-dev:576',
'frontend-dev:577', 'frontend-dev:579', 'frontend-dev:580', 'frontend-dev:581', 'frontend-dev:582',
'frontend-dev:583', 'frontend-dev:584', 'frontend-dev:585', 'frontend-dev:586', 'frontend-dev:590',
'frontend-dev:591', 'frontend-dev:592', 'frontend-dev:593', 'frontend-dev:594', 'frontend-dev:595',
'frontend-dev:596', 'frontend-dev:597', 'frontend-dev:599', 'frontend-dev:600', 'frontend-dev:602',
'frontend-dev:604'
仅指定1个时,最后的az命令az acr repository delete -n mydevacr --image frontend-dev:604 --yes
删除59张图像。
这怎么可能?
我在这里“匿名”了一些东西,以免透露太多我们的设置。
而且,由于这是在Jenkins Pipeline中运行的,所以我不得不转义$符号,以便Groovy不会尝试对其进行处理。
据我所知,您只是在存储库中列出了图像,然后将其删除,没有任何条件。
我认为您需要做的是在脚本中添加条件。例如,您需要删除存储库中的五个最旧的图像,可以通过以下命令获取图像:
az acr repository show-tags -n \$ACR --repository \$imageName --orderby time_asc --top 5
注意:时间会增加,所以您需要按time_asc排序图像。而且此命令仅显示五个图像。您可以根据需要获取更多图像。
而且,命令az acr repository delete
将删除您所使用的图像标签所引用的清单,以及所有其他引用同一清单的标签。因此,当清单全部删除后,该命令将不会再次删除清单。我认为这是您遇到的情况。因此,我建议您仅取消标记图像,而不要直接删除图像。