删除 Azure 容器注册表中的容器映像

要保持 Azure 容器注册表的大小不变,应定期删除过时的映像数据。 尽管部分部署到生产的容器映像可能需要存储更长时间,但通常可更快删除其他映像。 例如,在自动化生成和测试方案中,可使用从未部署的映像快速填充注册表,并可在完成生成和测试通过后不久即将其清除。

因为可通过多种不同的方式删除映像数据,请务必了解每个删除操作如何影响存储使用情况。 本文介绍几种删除映像数据的方法:

  • 删除存储库:删除存储库中的所有映像和所有唯一层。
  • 标记删除:删除映像、其标记、其引用的所有唯一层,以及与其关联的所有其他标记。
  • 清单摘要删除:删除映像、该映像引用的所有唯一层,以及与其关联的所有标记。

有关这些概念的介绍,请参阅关于注册表、存储库和映像

注意

在你删除映像数据后,Azure 容器注册表会立即停止对关联存储的计费。 但是,注册表会使用异步过程恢复关联的存储空间。 注册表需要一些时间才能清理完层并显示更新的存储使用情况。

删除存储库

删除存储库时,将一并删除存储库中的所有映像,包括所有标记、唯一层和清单。 删除存储库时,将恢复引用该存储库中唯一层的映像所使用的存储空间。

以下 Azure CLI 命令会删除“acr-helloworld”存储库,并删除该存储库中的所有标记和清单。 如果已删除清单所引用的层未由注册表中的其他任何映像引用,则还删除其层数据,从而恢复存储空间。

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

按标记删除

可通过在删除操作中指定存储库名称和标记,删除存储库中的单个映像。 如果按标记删除,将恢复该映像中任何唯一层所用的存储空间;唯一层是指不由存储库中的其他任何映像共享的层。

要按标记删除,请使用 az acr repository delete,并在 --image 参数中指定映像名称。 此操作删除映像的所有唯一层以及与之关联的任何其他标记。

例如,从注册表“myregistry”中删除“acr-helloworld:latest”映像:

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

删除无标记的映像

清单摘要部分中所述,使用现有标记推送已修改的映像时,会取消标记之前推送的映像,从而导致孤立(或“无关联”)的映像。 之前推送的映像的清单及其层数据仍保留在注册表中。 请注意以下事件序列:

  1. 推送具有标记 latest 的映像 acr-helloworld:docker push myregistry.azurecr.cn/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. 修改 acr-helloworld Dockerfile

  4. 推送具有标记 latest 的映像 acr-helloworld:docker push myregistry.azurecr.cn/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 purge 容器命令的 ACR 任务,以删除早于特定时间段或与指定名称筛选器匹配的所有标记。 可以选择将 acr purge 配置为删除未标记的清单。

    acr purge 容器命令目前为预览版。 有关详细信息,请参阅自动清除 Azure 容器注册表中的映像

  • (可选)设置每个注册表的保留策略,以管理未标记的清单。 启用保留策略后,在设置的时间段后将自动删除注册表中没有任何关联标记的映像清单和基础层数据。

    保留策略目前是“高级”容器注册表的预览功能。 保留策略仅适用于策略生效后创建的未标记清单。

后续步骤

若要详细了解 Azure 容器注册表中的映像存储,请参阅 Azure 容器注册表中的容器映像存储