锁定 Azure 容器注册表中的容器映像

在 Azure 容器注册表中,可以锁定某个映像版本或存储库,使之不会被删除或更新。 若要锁定映像或存储库,可使用 Azure CLI 命令 az acr repository update 更新其属性。

本文要求在本地运行 Azure CLI(建议使用 2.0.55 或更高版本)。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

重要

本文不适用于锁定整个注册表,例如,在 Azure 门户中使用“设置”>“锁定”,或在 Azure CLI 中使用 az lock 命令。 锁定注册表资源不会阻止你在存储库中创建、更新或删除数据。 锁定注册表只会影响管理操作,如添加或删除复制,或删除注册表本身。 有关详细信息,请参阅锁定资源以防止意外更改

方案

默认情况下,Azure 容器注册表中带标记的映像是可变的,因此,如果具有相应的权限,你可以反复更新带有相同标记的映像并将其推送到注册表。 还可以根据需要删除容器映像。 开发映像并需要保持注册表的大小时,此行为很有用。

但是,将容器映像部署到生产环境时,可能需要不可变的容器映像。 不可变的映像是指不能意外删除或覆盖的映像。

有关对注册表中的映像进行标记和版本控制的策略,请参阅有关对容器映像进行标记和版本控制的建议

使用 az acr repository update 命令设置存储库属性,以便可以:

  • 锁定某个映像版本或整个存储库

  • 防止删除某个映像版本或存储库,但允许更新

  • 防止针对某个映像版本或整个存储库执行读取(提取)操作

有关示例,请参阅以下部分。

锁定映像或存储库

显示当前存储库属性

若要查看存储库的当前属性,请运行以下 az acr repository show 命令:

az acr repository show \
    --name myregistry --repository myrepo \
    --output jsonc

显示当前映像属性

若要查看标记的当前属性,请运行以下 az acr repository show 命令:

az acr repository show \
    --name myregistry --image myrepo:tag \
    --output jsonc

按标记锁定映像

若要锁定 myregistry 中的 myrepo:tag 映像,请运行以下 az acr repository update 命令:

az acr repository update \
    --name myregistry --image myrepo:tag \
    --write-enabled false

按清单摘要锁定映像

若要锁定清单摘要标识的 myrepo 映像(SHA-256 哈希,表示为 sha256:...),请运行以下命令。 (若要查找与一个或多个映像标记关联的清单摘要,请运行 az acr manifest list-metadata 命令。)

az acr repository update \
    --name myregistry --image myrepo@sha256:123456abcdefg \
    --write-enabled false

锁定存储库

若要锁定 myrepo 存储库及其中的所有映像,请运行以下命令:

az acr repository update \
    --name myregistry --repository myrepo \
    --write-enabled false

列出当前存储库属性

若要更新存储库属性以显示映像锁列表,请运行 az acr repository update 命令。

az acr repository update \
    --name myregistry --repository myrepo \ 
    --list-enabled false

显示映像锁上的映像属性

若要在属性上启用 --list-enabled false 的情况下查询映像锁上的标记,请运行 az acr repository show 命令。

az acr repository show-manifests \
    --name myregistry --repository myrepo \
    --query "[?listEnabled==null].tags" 
    --output table

检查标记及其相应清单的映像属性。

注意

  • 标记和清单的可更改属性是单独管理的。 也就是说,标记的设置属性 deleteEnabled=false 不会为相应的清单设置相同的内容。
  • 使用以下脚本来查询属性:
registry="myregistry"
repo="myrepo"
tag="mytag"

az cloud set -n AzureChinaCloud
az login
# az cloud set -n AzureCloud   //means return to Public Azure.

az acr repository show -n $registry --repository $repo
az acr manifest show-metadata -r $registry -n "$repo:$tag"
digest=$(az acr manifest show-metadata -r $registry -n "$repo:$tag" --query digest -o tsv)
az acr manifest show-metadata -r $registry -n "$repo@$digest"

注意

如果使用 writeEnabled=falsedeleteEnabled=false 设置映像属性,它将阻止删除映像。

防止删除映像或存储库

防止删除映像

若要允许更新但不删除 myrepo:tag 映像,请运行以下命令:

az acr repository update \
    --name myregistry --image myrepo:tag \
    --delete-enabled false --write-enabled true

防止删除存储库

以下命令会设置 myrepo 存储库,使其无法被删除。 仍可以更新或删除单个映像。

az acr repository update \
    --name myregistry --repository myrepo \
    --delete-enabled false --write-enabled true

防止针对映像或存储库执行读取操作

若要防止对 myrepo:tag 执行读取(拉取)操作,请运行以下命令:

az acr repository update \
    --name myregistry --image myrepo:tag \
    --read-enabled false

若要防止对 myrepo 存储库中的所有映像执行读取操作,请运行以下命令:

az acr repository update \
    --name myregistry --repository myrepo \
    --read-enabled false

解锁映像或存储库

若要还原 myrepo:tag 映像的默认行为,使其可被删除和更新,请运行以下命令:

az acr repository update \
    --name myregistry --image myrepo:tag \
    --delete-enabled true --write-enabled true

若要还原 myrepo 存储库的默认行为,请运行以下命令,以便删除和更新各个映像:

az acr repository update \
    --name myregistry --repository myrepo \
    --delete-enabled true --write-enabled true

但是,如果清单上有锁,则需要运行其他命令来解锁清单。

az acr repository update \
   --name myregistry --image $repo@$digest \
   --delete-enabled true --write-enabled true

后续步骤

本文已介绍如何使用 az acr repository update 命令来防止删除或更新存储库中的映像版本。 若要设置其他属性,请参阅 az acr repository update 命令参考。

若要查看针对某个映像版本或存储库设置的属性,请使用 az acr repository show 命令。

有关删除操作的详细信息,请参阅删除 Azure 容器注册表中的容器映像