锁定 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=false
或 deleteEnabled=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 容器注册表中的容器映像。