Удаление образов контейнеров в службе "Реестр контейнеров Azure"

Чтобы управлять размером Реестра контейнеров Azure, необходимо периодически удалять данные устаревших образов. Хотя некоторые образы контейнеров, развернутые в рабочей среде, могут потребовать долговременного хранения, другие, как правило, могут быть удалены быстрее. Например, в сценарии автоматизированной сборки и тестирования реестр может быть быстро заполнен изображениями, которые никогда не придется развертывать, и после того, как завершится этап построения и тестирования, они незамедлительно могут быть удалены.

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

  • Удаление репозитория. Это действие удаляет из репозитория все образы и все уникальные слои.
  • Удаление тегов. Это действие удаляет образ, тег и все уникальные слои, связанные с образом, и все другие теги, связанные с образом.
  • Удаление дайджеста манифеста. Удаление образа, все уникальных слоев в образе и всех тегов, связанных с образом.

Общие сведения об этих основных понятиях см. в статье о реестрах, репозиториях и образах.

Примечание

После удаления данных образа Реестр контейнеров Azure немедленно прекращает выставление счетов за соответствующее хранилище. Однако реестр восстанавливает связанное дисковое пространство с помощью асинхронного процесса. Для очистки слоев в реестре и отображения обновленных сведений об использовании хранилища требуется некоторое время.

Удаление репозитория

При удалении репозитория удаляются все образы хранилища, включая все теги, уникальные слои и манифесты. При удалении репозитория восстанавливается пространство для хранения, используемое образами, которые ссылаются на уникальные слои в этом репозитории.

Следующая команда Azure CLI удаляет репозиторий acr-helloworld и все теги и манифесты репозитория. Если слои, на которые ссылаются удаляемые манифесты, никак не связаны с другими образами реестра, их данные слоя также удаляются, освобождая пространство для хранения.

 az acr repository delete --name myregistry --repository acr-helloworld

Удаление по тегу

С помощью операции удаления можно удалить отдельные образы из репозитория по указанным именам репозиториев и тегов. При удалении по тегу восстанавливается дисковое пространство, используемое любыми уникальными слоями в образе (слои, которые не используются совместно с другими образами в реестре).

Чтобы удалить тег, используйте команду az acr repository delete и укажите имя образа в параметре --image. Удаляются все уникальные слои образа и все другие теги, связанные с удаляемым образом.

Пример удаления образа acr-helloworld:latest из реестра myregistry.

az acr repository delete --name myregistry --image acr-helloworld:latest
This operation will delete the manifest 'sha256:0a2e01852872580b2c2fea9380ff8d7b637d3928783c55beb3f21a6e58d5d108' and all the following images: 'acr-helloworld:latest', 'acr-helloworld:v3'.
Are you sure you want to continue? (y/n):

Совет

Удаление по тегу не следует путать с удалением тега (обестегивание). Удалить тег можно с помощью команды Azure CLI az acr repository untag. После удаления тега размер образа остается без изменений, так как манифест и данные слоя остаются в реестре. Удаляется только ссылка на тег.

Удаление с помощью дайджеста манифеста

Дайджест манифеста может быть связан с одним, несколькими тегами или не иметь связей с тегами вообще. При удалении с помощью дайджеста все теги, связанные манифестом, удаляются, как и данные слоя для любых слоев, уникальных для образа. Данные общего слоя не удаляются.

Для удаления с помощью дайджеста сначала перечислите дайджесты манифеста для репозитория, содержащего изображения, которые необходимо удалить. Пример:

az acr manifest list-metadata --name acr-helloworld --registry myregistry
[
  {
    "digest": "sha256:0a2e01852872580b2c2fea9380ff8d7b637d3928783c55beb3f21a6e58d5d108",
    "tags": [
      "latest",
      "v3"
    ],
    "timestamp": "2018-07-12T15:52:00.2075864Z"
  },
  {
    "digest": "sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57",
    "tags": [
      "v2"
    ],
    "timestamp": "2018-07-12T15:50:53.5372468Z"
  }
]

Затем в команде az acr repository delete необходимо указать дайджест, который требуется удалить. Команда имеет следующий формат.

az acr repository delete --name <acrName> --image <repositoryName>@<digest>

Пример удаления последнего манифеста из списка выходных данных (с тегом "v2").

az acr repository delete --name myregistry --image acr-helloworld@sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57
This operation will delete the manifest 'sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57' and all the following images: 'acr-helloworld:v2'.
Are you sure you want to continue? (y/n): 

acr-helloworld:v2Образ удаляется из реестра, как и любые данные слоя, уникальные для этого образа. Если манифест связан с несколькими тегами, все связанные теги также удаляются.

Удаление дайджестов по метке времени

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

Следующая команда Azure CLI выводит все дайджесты манифеста в репозитории старше указанной метки времени в порядке возрастания. Замените <acrName> и <repositoryName> значениями, уместными для вашей среды. Метка времени может быть полным выражением даты и времени или даты как в этом примере.

az acr manifest list-metadata --name <repositoryName> --registry <acrName> \
    --orderby time_asc -o tsv --query "[?lastUpdateTime < '2019-04-05'].[digest, lastUpdateTime]"

Определив устаревшие дайджесты манифеста, можно выполнить следующий скрипт Bash, чтобы удалить дайджесты манифеста старше указанной метки времени. Для работы этого сценария требуется Azure CLI и xargs. Сценарий не выполняет удаление по умолчанию. Чтобы включить удаление образа, измените значение ENABLE_DELETE на true.

Предупреждение

С осторожностью используйте следующие примеры сценариев — данные удаленных изображений восстановлению не подлежат. Если у вас есть системы, которые получают образы с помощью дайджеста манифеста (а не от имени образа), этот сценарий запускать не стоит. Удаление манифестов дайджестов не позволит этим системам получать образы из реестра. Вместо получения с помощью манифеста попробуйте внедрить схему уникальных тегов, которая рекомендуется в качестве лучшей методики.

#!/bin/bash

# WARNING! This script deletes data!
# Run only if you do not have systems
# that pull images via manifest digest.

# Change to 'true' to enable image delete
ENABLE_DELETE=false

# Modify for your environment
# TIMESTAMP can be a date-time string such as 2019-03-15T17:55:00.
REGISTRY=myregistry
REPOSITORY=myrepository
TIMESTAMP=2019-04-05  

# Delete all images older than specified timestamp.

if [ "$ENABLE_DELETE" = true ]
then
    az acr manifest list-metadata --name $REPOSITORY --registry $REGISTRY \
    --orderby time_asc --query "[?lastUpdateTime < '$TIMESTAMP'].digest" -o tsv \
    | xargs -I% az acr repository delete --name $REGISTRY --image $REPOSITORY@% --yes
else
    echo "No data deleted."
    echo "Set ENABLE_DELETE=true to enable deletion of these images in $REPOSITORY:"
    az acr manifest list-metadata --name $REPOSITORY --registry $REGISTRY \
   --orderby time_asc --query "[?lastUpdateTime < '$TIMESTAMP'].[digest, lastUpdateTime]" -o tsv
fi

Удаление образов без тегов

Как было упомянуто в разделе Дайджест манифеста, в результате отправки измененных образов с помощью существующего тега untags ранее отправленный образ стал потерянным (или "несвязанным"). Манифест образа, который был отправлен ранее, и его данные слоя остаются в реестре. Рассмотрим следующую последовательность событий.

  1. Отправка образа acr-helloworld с тегом latest. docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Проверка манифеста для репозитория acr-helloworld.

    az acr manifest list-metadata --name acr-helloworld --registry myregistry
    
    
    [
      {
        "digest": "sha256:d2bdc0c22d78cde155f53b4092111d7e13fe28ebf87a945f94b19c248000ceec",
        "tags": [
          "latest"
        ],
        "timestamp": "2018-07-11T21:32:21.1400513Z"
      }
    ]
    
  3. Изменение Dockerfile репозитория acr-helloworld.

  4. Отправка образа acr-helloworld с тегом latest. docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Проверка манифеста для репозитория acr-helloworld.

    az acr manifest list-metadata --name acr-helloworld --registry myregistry
    
    [
      {
     "architecture": "amd64",
     "changeableAttributes": {
       "deleteEnabled": true,
       "listEnabled": true,
       "quarantineDetails": "{\"state\":\"Scan Passed\",\"link\":\"https://aka.ms/test\",\"scanner\":\"Azure Security Monitoring-Qualys Scanner\",\"result\":{\"version\":\"2020-05-13T00:23:31.954Z\",\"summary\":[{\"severity\":\"High\",\"count\":2},{\"severity\":\"Medium\",\"count\":0},{\"severity\":\"Low\",\"count\":0}]}}",
       "quarantineState": "Passed",
       "readEnabled": true,
       "writeEnabled": true
     },
     "configMediaType": "application/vnd.docker.container.image.v1+json",
     "createdTime": "2020-05-16T04:25:14.3112885Z",
     "digest": "sha256:eef2ef471f9f9d01fd2ed81bd2492ddcbc0f281b0a6e4edb700fbf9025448388",
     "imageSize": 22906605,
     "lastUpdateTime": "2020-05-16T04:25:14.3112885Z",
     "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
     "os": "linux",
     "timestamp": "2020-05-16T04:25:14.3112885Z"
      }
    ]
    

Массив тегов удаляется из метаданных при снятии тегов с изображения. Этот манифест существует в реестре вместе с уникальными данными слоя, на которые он ссылается. Чтобы удалить потерянные образы и их данные слоя, необходимо удалить дайджест манифеста.

Автоматическая очистка тегов и манифестов

Реестр контейнеров Azure предоставляет следующие автоматические методы удаления тегов и манифестов, а также связанные с ними уникальные данные слоя.

  • Создайте задачу ACR, которая выполняет команду контейнера acr purge, чтобы удалить все теги старше определенного времени или соответствующие заданному фильтру имен. При необходимости настройте acr purge для удаления манифестов без тегов.

    В настоящее время команда контейнера acr purge доступна в предварительной версии. Более подробные сведения см. в разделе Автоматическая очистка образов из реестра контейнеров Azure.

  • При необходимости задайте политику хранения для каждого реестра, чтобы управлять манифестами без тегов. При включении политики хранения манифесты образов в реестре, у которых нет связанных тегов, а также данные базового слоя, автоматически удаляются после заданного периода.

    Политика хранения в настоящее время является предварительной версией функции в реестрах контейнеров класса Premium. Политика хранения применяется только к манифестам без тегов, созданным после вступления политики в силу.

Дальнейшие шаги

Дополнительные сведения о хранилище образов в реестре контейнеров Azure см. в статье Хранилище образов контейнеров в реестре контейнеров Azure.