Автоматическая очистка образов из реестра контейнеров Azure

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

В настоящее время команда acr purge распространяется в общедоступном образе контейнера (mcr.microsoft.com/acr/acr-cli:0.5), созданном на основе исходного кода в репозитории acr-cli на GitHub. acr purge сейчас находится на этапе предварительной версии.

Для выполнения примеров задач ACR в этой статье можно использовать Azure Cloud Shell или локальный экземпляр Azure CLI. Если вы хотите использовать его локально, требуется версия 2.0.76 или более поздняя. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

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

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

Если вы хотите удалить манифесты или теги одного образа с помощью команд Azure CLI, см. раздел Удаление образов контейнеров в реестре контейнеров Azure.

Использование команды очистки

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

Примечание

acr purge не удаляет репозиторий или тег образа, если атрибут write-enabled имеет значение false. Дополнительные сведения см. в разделе Блокировка образа контейнера в реестре контейнеров Azure.

acr purge предназначен для запуска в качестве команды контейнера в задаче ACR, чтобы она автоматически выполняла проверку подлинности с реестром, в котором запущена задача, и могла выполнять там действия. В примерах задач в этой статье используется команда acr purgeпсевдоним вместо полной команды образа контейнера.

Важно!

  • Стандартная команда для выполнения acr purgeaz acr run --registry <YOUR_REGISTRY> --cmd 'acr purge --optional parameter' /dev/null.
  • Мы рекомендуем выполнить команду complete acr purge , чтобы использовать очистку ACR. Например, запустите как acr purge --helpaz acr run --registry <YOUR_REGISTRY> --cmd 'acr purge --help' /dev/null.

Как минимум при запуске acr purge необходимо указать следующее:

  • --filter — имя репозитория регулярное выражение и имя тега регулярное выражение для фильтрации образов в репозитории. Примеры: --filter "hello-world:.*" соответствует всем тегам в репозитории hello-world, --filter "hello-world:^1.*" соответствует тегам, начинающимся с 1 в репозитории hello-world, а --filter ".*/cache:.*" соответствует всем тегам в репозиториях, заканчивающимся на /cache. Вы также можете передать несколько параметров --filter.
  • --ago — строка длительности в стиле Go для обозначения длительности, после которой образы удаляются. Длительность состоит из последовательности из одного или нескольких десятичных чисел, каждое из которых имеет суффикс единицы. Допустимые единицы времени: "d" (дни), "h" (часы) и "m" (минуты). Например, выбирает все отфильтрованные изображения, --ago 2d3h6m последние измененные более двух дней, 3 часов и 6 минут назад, а --ago 1.5h также изображения, которые были изменены более 1,5 часов назад.

acr purge поддерживает несколько необязательных параметров. Следующие два используются в примерах в этой статье.

  • --untagged — указывает, что все манифесты, не имеющие связанных тегов (манифесты без тегов), удаляются. Этот параметр также удаляет манифесты без тегов, которые уже удаляются.
  • --dry-run — указывает, что никакие данные не удаляются, а выходные данные одинаковы, как если бы команда выполнялась без этого флага. Этот параметр полезен для тестирования команды очистки, чтобы убедиться, что она не удаляет непреднамеренно данные, которые нужно сохранить.
  • --keep — указывает, что сохраняются последние x элементов из удаляемых тегов.
  • --concurrency — указывает количество одновременно выполняемых задач очистки. Если этот параметр не указан, используется значение по умолчанию.

Примечание

Фильтр --untagged не отвечает на фильтр --ago. Для дополнительных параметров запустите acr purge --help.

acr purge поддерживает другие функции команд задач ACR, включая переменные запуска и журналы выполнения задач, которые передаются в потоке и также сохраняются для последующего извлечения.

Выполнение в задаче по требованию

В следующем примере с помощью команды az acr run выполняется команда acr purge по требованию. В этом примере удаляются все теги и манифесты образов в репозитории hello-world в myregistry, которые были изменены более одного дня назад, и все манифесты без тегов. Команда контейнера передается с помощью переменной среды. Задача выполняется без исходного контекста.

# Environment variable for container command line
PURGE_CMD="acr purge --filter 'hello-world:.*' \
  --untagged --ago 1d"

az acr run \
  --cmd "$PURGE_CMD" \
  --registry myregistry \
  /dev/null

Выполнение с помощью запланированной задачи

В следующем примере используется команда az acr task create для создания ежедневной запланированной задачи ACR. Задача очищает теги, измененные более 7 дней назад, в репозитории hello-world. Команда контейнера передается с помощью переменной среды. Задача выполняется без исходного контекста.

# Environment variable for container command line
PURGE_CMD="acr purge --filter 'hello-world:.*' \
  --ago 7d"

az acr task create --name purgeTask \
  --cmd "$PURGE_CMD" \
  --schedule "0 0 * * *" \
  --registry myregistry \
  --context /dev/null

Выполните команду az acr task show, чтобы убедиться, что триггер таймера настроен.

Очистка большого количества тегов и манифестов

Очистка большого количества тегов и манифестов может занять несколько минут или больше. Чтобы очистить тысячи тегов и манифестов, команде может потребоваться больше времени, чем время ожидания по умолчанию — 600 секунд для задачи по требованию или 3600 секунд для запланированной задачи. В случае превышения времени ожидания удаляется только часть тегов и манифестов. Чтобы обеспечить выполнение крупномасштабной очистки, передайте параметр --timeout, чтобы увеличить значение.

Например, следующая задача по требованию задает время ожидания 3600 секунд (1 час):

# Environment variable for container command line
PURGE_CMD="acr purge --filter 'hello-world:.*' \
  --ago 1d --untagged"

az acr run \
  --cmd "$PURGE_CMD" \
  --registry myregistry \
  --timeout 3600 \
  /dev/null

Пример Запланированная очистка нескольких репозиториев в реестре

В этом примере рассматривается использование acr purge для периодической очистки нескольких репозиториев в реестре. Например, у вас может быть конвейер разработки, который передает образы в репозитории samples/devimage1 и samples/devimage2. Вы периодически импортируете образы разработки в рабочий репозиторий для развертываний, поэтому вам больше не нужны образы разработки. Еженедельно вы очищаете репозитории samples/devimage1 и samples/devimage2 в процессе подготовки к работе на следующей неделе.

Предварительный просмотр очистки

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

В следующем примере фильтр в каждом репозитории выбирает все теги. Параметр --ago 0d соответствует образам с любым периодом существования в репозиториях, соответствующих фильтрам. Измените критерии, если это необходимо для вашего сценария. Параметр --untagged указывает на удаление манифестов в дополнение к тегам. Команда контейнера передается команде az acr run с помощью переменной среды.

# Environment variable for container command line
PURGE_CMD="acr purge \
  --filter 'samples/devimage1:.*' --filter 'samples/devimage2:.*' \
  --ago 0d --untagged --dry-run"

az acr run \
  --cmd "$PURGE_CMD" \
  --registry myregistry \
  /dev/null

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

Образец вывода:

[...]
Deleting tags for repository: samples/devimage1
myregistry.azurecr.io/samples/devimage1:232889b
myregistry.azurecr.io/samples/devimage1:a21776a
Deleting manifests for repository: samples/devimage1
myregistry.azurecr.io/samples/devimage1@sha256:81b6f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e788b
myregistry.azurecr.io/samples/devimage1@sha256:3ded859790e68bd02791a972ab0bae727231dc8746f233a7949e40f8ea90c8b3
Deleting tags for repository: samples/devimage2
myregistry.azurecr.io/samples/devimage2:5e788ba
myregistry.azurecr.io/samples/devimage2:f336b7c
Deleting manifests for repository: samples/devimage2
myregistry.azurecr.io/samples/devimage2@sha256:8d2527cde610e1715ad095cb12bc7ed169b60c495e5428eefdf336b7cb7c0371
myregistry.azurecr.io/samples/devimage2@sha256:ca86b078f89607bc03ded859790e68bd02791a972ab0bae727231dc8746f233a

Number of deleted tags: 4
Number of deleted manifests: 4
[...]

Планирование очистки

Проверив пробный запуск, создайте запланированную задачу для автоматизации очистки. В следующем примере еженедельная задача планируется на воскресенье в 1:00 UTC и выполняется предыдущая команда очистки:

# Environment variable for container command line
PURGE_CMD="acr purge \
  --filter 'samples/devimage1:.*' --filter 'samples/devimage2:.*' \
  --ago 0d --untagged"

az acr task create --name weeklyPurgeTask \
  --cmd "$PURGE_CMD" \
  --schedule "0 1 * * Sun" \
  --registry myregistry \
  --context /dev/null

Выполните команду az acr task show, чтобы убедиться, что триггер таймера настроен.

Дальнейшие действия

Узнайте о других вариантах удаления данных образа в реестре контейнеров Azure.

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