次の方法で共有

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

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

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

重要

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

方案

默认情况下,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

按标记锁定映像

若要锁定 myrepo:tag 镜像 myregistry,请运行以下 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 容器注册表中的容器映像