Почему из ACR было удалено более одного изображения? - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь написать скрипт очистки. Сценарий должен удалять старые изображения ACR. Вот команда sh, которая выполняется в Jenkins:

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'

Последняя команда az az acr repository delete -n mydevacr --image frontend-dev:604 --yes удаляет 59 изображений только тогда, когда Указано 1.

Как это возможно?

Здесь я «анонимизировал» вещи, чтобы не раскрывать слишком много наших настроек.

И, поскольку это работает в конвейере Jenkins, мне пришлось избегать знаков $, чтобы Groovy не пытается их обработать.

1 Ответ

1 голос
/ 26 марта 2020

Как я вижу в вашем скрипте, вы просто перечисляете изображения в хранилище, а затем удаляете их без каких-либо условий.

Я думаю, что вам нужно добавить условие в сценарий. Например, вам нужно удалить пять самых старых изображений в хранилище, вы можете получить изображения с помощью команды:

az acr repository show-tags -n \$ACR --repository \$imageName --orderby time_asc --top 5

Примечание: время - это вещь, которая увеличивается, поэтому вам нужно заказать изображения по времени c. И эта команда показывает вам только пять изображений. Вы можете получить больше изображений по мере необходимости.

А также команда az acr repository delete удалит манифест, на который ссылается используемый вами тег изображения, и все другие теги, ссылающиеся на тот же манифест. Поэтому, когда манифест все удален, то команда не будет удалять манифест снова. Я думаю, что это ситуация, с которой вы встречаетесь. Поэтому я рекомендую вам просто разметить изображения, а не удалять их напрямую.

...