Удаление образов контейнеров в реестре контейнеров Azure с помощью Azure CLIDelete container images in Azure Container Registry using the Azure CLI

Чтобы управлять размером Реестра контейнеров Azure, необходимо периодически удалять данные устаревших образов.To maintain the size of your Azure container registry, you should periodically delete stale image data. Хотя некоторые образы контейнеров, развернутые в рабочей среде, могут потребовать долговременного хранения, другие, как правило, могут быть удалены быстрее.While some container images deployed into production may require longer-term storage, others can typically be deleted more quickly. Например, в сценарии автоматизированной сборки и тестирования реестр может быть быстро заполнен изображениями, которые никогда не придется развертывать, и после того, как завершится этап построения и тестирования, они незамедлительно могут быть удалены.For example, in an automated build and test scenario, your registry can quickly fill with images that might never be deployed, and can be purged shortly after completing the build and test pass.

Так как данные образов можно удалить несколькими способами, важно понимать, как каждая из операций удаления влияет на использование хранилища.Because you can delete image data in several different ways, it's important to understand how each delete operation affects storage usage. В этой статье рассматривается несколько методов удаления данных изображения.This article covers several methods for deleting image data:

  • Удаление репозитория. Это действие удаляет из репозитория все образы и все уникальные слои.Delete a repository: Deletes all images and all unique layers within the repository.
  • Удаление тегов. Это действие удаляет образ, тег и все уникальные слои, связанные с образом, и все другие теги, связанные с образом.Delete by tag: Deletes an image, the tag, all unique layers referenced by the image, and all other tags associated with the image.
  • Удаление дайджеста манифеста. Удаление образа, все уникальных слоев в образе и всех тегов, связанных с образом.Delete by manifest digest: Deletes an image, all unique layers referenced by the image, and all tags associated with the image.

Примеры сценариев позволяют автоматизировать операции удаления.Sample scripts are provided to help automate delete operations.

Общие сведения об этих концепциях см. в статье о реестрах, репозиториях и образах.For an introduction to these concepts, see About registries, repositories, and images.

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

При удалении репозитория удаляются все образы хранилища, включая все теги, уникальные слои и манифесты.Deleting a repository deletes all of the images in the repository, including all tags, unique layers, and manifests. При удалении репозитория восстанавливается дисковое пространство, используемое образами, которые ссылаются на уникальные слои в этом репозитории.When you delete a repository, you recover the storage space used by the images that reference unique layers in that repository.

Следующая команда Azure CLI удаляет репозиторий acr-helloworld и все теги и манифесты репозитория.The following Azure CLI command deletes the "acr-helloworld" repository and all tags and manifests within the repository. Если на слои, на которые ссылаются удаленные манифесты, нет ссылок из других образов в реестре, их данные слоя также удаляются, что позволяет восстановить дисковое пространство.If layers referenced by the deleted manifests are not referenced by any other images in the registry, their layer data is also deleted, recovering the storage space.

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

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

С помощью операции удаления можно удалить отдельные образы из репозитория по указанным именам репозиториев и тегов.You can delete individual images from a repository by specifying the repository name and tag in the delete operation. При удалении по тегу восстанавливается дисковое пространство, используемое любыми уникальными слоями в образе (слои, которые не используются совместно с другими образами в реестре).When you delete by tag, you recover the storage space used by any unique layers in the image (layers not shared by any other images in the registry).

Чтобы удалить тег, используйте команду az acr repository delete и укажите имя образа в параметре --image.To delete by tag, use az acr repository delete and specify the image name in the --image parameter. Удаляются все уникальные слои образа и все другие теги, связанные с удаляемым образом.All layers unique to the image, and any other tags associated with the image are deleted.

Пример удаления образа acr-helloworld:latest из реестра myregistry.For example, deleting the "acr-helloworld:latest" image from registry "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):

Совет

Удаление по тегу не следует путать с удалением тега (обестегивание).Deleting by tag shouldn't be confused with deleting a tag (untagging). Удалить тег можно с помощью команды Azure CLI az acr repository untag.You can delete a tag with the Azure CLI command az acr repository untag. При удалить тегии изображения пробелы не освобождаются, поскольку данные манифеста и слоя остаются в реестре.No space is freed when you untag an image because its manifest and layer data remain in the registry. Удаляется только ссылка на тег.Only the tag reference itself is deleted.

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

Дайджест манифеста может быть связан с одним, несколькими тегами или не иметь связей с тегами вообще.A manifest digest can be associated with one, none, or multiple tags. При удалении с помощью дайджеста все теги, связанные манифестом, удаляются, как и данные слоя для любых слоев, уникальных для образа.When you delete by digest, all tags referenced by the manifest are deleted, as is layer data for any layers unique to the image. Данные общего слоя не удаляются.Shared layer data is not deleted.

Для удаления с помощью дайджеста сначала перечислите дайджесты манифеста для репозитория, содержащего изображения, которые необходимо удалить.To delete by digest, first list the manifest digests for the repository containing the images you wish to delete. Пример:For example:

az acr repository show-manifests --name myregistry --repository acr-helloworld
[
  {
    "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 необходимо указать дайджест, который требуется удалить.Next, specify the digest you wish to delete in the az acr repository delete command. Команда имеет следующий формат.The format of the command is:

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

Пример удаления последнего манифеста из списка выходных данных (с тегом "v2").For example, to delete the last manifest listed in the preceding output (with the tag "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Образ удаляется из реестра, как и все данные слоя, уникальные для этого образа.The acr-helloworld:v2 image is deleted from the registry, as is any layer data unique to that image. Если манифест связан с несколькими тегами, все связанные теги также удаляются.If a manifest is associated with multiple tags, all associated tags are also deleted.

Удалить дайджесты по метке времениDelete digests by timestamp

Чтобы сохранить размер репозитория или реестра, может потребоваться периодически удалять дайджесты манифеста, которые старше определенной даты.To maintain the size of a repository or registry, you might need to periodically delete manifest digests older than a certain date.

Следующая команда Azure CLI выводит все дайджест манифеста в репозитории старше указанной метки времени в возрастающем порядке.The following Azure CLI command lists all manifest digest in a repository older than a specified timestamp, in ascending order. Замените <acrName> и <repositoryName> значениями, уместными для вашей среды.Replace <acrName> and <repositoryName> with values appropriate for your environment. Метка времени может быть полным выражением даты и времени или датой, как в этом примере.The timestamp could be a full date-time expression or a date, as in this example.

az acr repository show-manifests --name <acrName> --repository <repositoryName> \
--orderby time_asc -o tsv --query "[?timestamp < '2019-04-05'].[digest, timestamp]"

Определив устаревшие дайджесты манифеста, можно выполнить следующий скрипт Bash, чтобы удалить дайджесты манифеста старше указанной метки времени.After identifying stale manifest digests, you can run the following Bash script to delete manifest digests older than a specified timestamp. Для работы этого сценария требуется Azure CLI и xargs.It requires the Azure CLI and xargs. Сценарий не выполняет удаление по умолчанию.By default, the script performs no deletion. Чтобы включить удаление образа, измените значение ENABLE_DELETE на true.Change the ENABLE_DELETE value to true to enable image deletion.

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

Используйте следующий пример сценария с осторожностью: удаленные данные изображения являются невосстанавливаемыми.Use the following sample script with caution--deleted image data is UNRECOVERABLE. При наличии систем, которые извлекают образы по дайджесту манифеста (в отличие от имени образа), не следует запускать эти сценарии.If you have systems that pull images by manifest digest (as opposed to image name), you should not run these scripts. Удаление дайджестов манифеста не позволит этим системам извлечь образы из реестра.Deleting the manifest digests will prevent those systems from pulling the images from your registry. Вместо получения с помощью манифеста попробуйте внедрить схему уникальных тегов, которая рекомендуется в качестве лучшей методики.Instead of pulling by manifest, consider adopting a unique tagging scheme, a recommended best practice.

#!/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 repository show-manifests --name $REGISTRY --repository $REPOSITORY \
    --orderby time_asc --query "[?timestamp < '$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 repository show-manifests --name $REGISTRY --repository $REPOSITORY \
   --orderby time_asc --query "[?timestamp < '$TIMESTAMP'].[digest, timestamp]" -o tsv
fi

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

Как было упомянуто в разделе Дайджест манифеста, в результате отправки измененных образов с помощью существующего тега untags ранее отправленный образ стал потерянным (или "несвязанным").As mentioned in the Manifest digest section, pushing a modified image using an existing tag untags the previously pushed image, resulting in an orphaned (or "dangling") image. Манифест образа, который был отправлен ранее, и его данные слоя остаются в реестре.The previously pushed image's manifest--and its layer data--remains in the registry. Рассмотрим следующую последовательность событий.Consider the following sequence of events:

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

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

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

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

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

    az acr repository show-manifests --name myregistry --repository acr-helloworld
    
    [
      {
        "digest": "sha256:7ca0e0ae50c95155dbb0e380f37d7471e98d2232ed9e31eece9f9fb9078f2728",
        "tags": [
          "latest"
        ],
        "timestamp": "2018-07-11T21:38:35.9170967Z"
      },
      {
        "digest": "sha256:d2bdc0c22d78cde155f53b4092111d7e13fe28ebf87a945f94b19c248000ceec",
        "tags": [],
        "timestamp": "2018-07-11T21:32:21.1400513Z"
      }
    ]
    

Как видно в выходных данных последнего шага последовательности, теперь существует потерянный манифест, "tags" свойство которого является пустым списком.As you can see in the output of the last step in the sequence, there is now an orphaned manifest whose "tags" property is an empty list. Этот манифест существует в реестре вместе с уникальными данными слоя, на которые он ссылается.This manifest still exists within the registry, along with any unique layer data that it references. Чтобы удалить потерянные образы и их данные слоя, необходимо удалить дайджест манифеста.To delete such orphaned images and their layer data, you must delete by manifest digest.

Удаление всех образов без теговDelete all untagged images

С помощью следующей команды Azure CLI можно вывести список всех образов репозитория без тегов.You can list all untagged images in your repository using the following Azure CLI command. Замените <acrName> и <repositoryName> значениями, уместными для вашей среды.Replace <acrName> and <repositoryName> with values appropriate for your environment.

az acr repository show-manifests --name <acrName> --repository <repositoryName> --query "[?tags[0]==null].digest"

Используя эту команду в скрипте, можно удалить все изображения без тегов в репозитории.Using this command in a script, you can delete all untagged images in a repository.

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

С осторожностью используйте следующие примеры сценариев — данные удаленных изображений восстановлению не подлежат.Use the following sample scripts with caution--deleted image data is UNRECOVERABLE. При наличии систем, которые извлекают образы по дайджесту манифеста (в отличие от имени образа), не следует запускать эти сценарии.If you have systems that pull images by manifest digest (as opposed to image name), you should not run these scripts. Удаление образов без тегов не позволит этим системам получать образы из реестра.Deleting untagged images will prevent those systems from pulling the images from your registry. Вместо получения с помощью манифеста попробуйте внедрить схему уникальных тегов, которая рекомендуется в качестве лучшей методики.Instead of pulling by manifest, consider adopting a unique tagging scheme, a recommended best practice.

Azure CLI в BashAzure CLI in Bash

Следующий сценарий Bash удаляет из репозитория все образы, которые не были помечены тегом.The following Bash script deletes all untagged images from a repository. Для работы этого сценария требуется Azure CLI и xargs.It requires the Azure CLI and xargs. Сценарий не выполняет удаление по умолчанию.By default, the script performs no deletion. Чтобы включить удаление образа, измените значение ENABLE_DELETE на true.Change the ENABLE_DELETE value to true to enable image deletion.

#!/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
REGISTRY=myregistry
REPOSITORY=myrepository

# Delete all untagged (orphaned) images
if [ "$ENABLE_DELETE" = true ]
then
    az acr repository show-manifests --name $REGISTRY --repository $REPOSITORY  --query "[?tags[0]==null].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 image deletion of these images in $REPOSITORY:"
    az acr repository show-manifests --name $REGISTRY --repository $REPOSITORY --query "[?tags[0]==null]" -o tsv
fi

Azure CLI в PowerShellAzure CLI in PowerShell

Следующий сценарий PowerShell удаляет из репозитория все образы, которые не были помечены тегом.The following PowerShell script deletes all untagged images from a repository. Для него требуется PowerShell и Azure CLI.It requires PowerShell and the Azure CLI. Сценарий не выполняет удаление по умолчанию.By default, the script performs no deletion. Чтобы включить удаление образа, измените значение $enableDelete на $TRUE.Change the $enableDelete value to $TRUE to enable image deletion.

# 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
$enableDelete = $FALSE

# Modify for your environment
$registry = "myregistry"
$repository = "myrepository"

if ($enableDelete) {
    az acr repository show-manifests --name $registry --repository $repository --query "[?tags[0]==null].digest" -o tsv `
    | %{ az acr repository delete --name $registry --image $repository@$_ --yes }
} else {
    Write-Host "No data deleted."
    Write-Host "Set `$enableDelete = `$TRUE to enable image deletion."
    az acr repository show-manifests --name $registry --repository $repository --query "[?tags[0]==null]" -o tsv
}

Автоматическая очистка тегов и манифестов (предварительная версия)Automatically purge tags and manifests (preview)

В качестве альтернативы Azure CLI командам скрипта запустите задачу контроля доступа по запросу или по расписанию, чтобы удалить все теги, которые старше определенной длительности или соответствуют указанному фильтру имен.As an alternative to scripting Azure CLI commands, run an on-demand or scheduled ACR task to delete all tags that are older than a certain duration or match a specified name filter. Дополнительные сведения см. в разделе Автоматическая очистка образов из реестра контейнеров Azure.For more information, see Automatically purge images from an Azure container registry.

При необходимости задайте политику хранения для каждого реестра, чтобы управлять манифестами без тегов.Optionally set a retention policy for each registry, to manage untagged manifests. При включении политики хранения манифесты изображений в реестре, у которых нет связанных тегов, а также данные базового слоя, автоматически удаляются после заданного периода.When you enable a retention policy, image manifests in the registry that don't have any associated tags, and the underlying layer data, are automatically deleted after a set period.

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

Дополнительные сведения об образе хранилища в реестре контейнеров Azure см. в статье Хранение образа контейнера в реестре контейнеров Azure.For more information about image storage in Azure Container Registry see Container image storage in Azure Container Registry.