本文介绍如何在 Azure 容器注册表(ACR)中启用 项目缓存功能 ,以便从另一个 Azure 容器注册表缓存映像。 下游注册表使用托管标识向上游注册表进行身份验证,因此无需在 Azure 密钥保管库 中存储凭据。
除了此处列出的先决条件之外,还需要具有活动订阅的 Azure 帐户。 创建试用版订阅。
先决条件
- 现有的下游 ACR 实例(本文中称为
MyRegistry)。 如果还没有 容器注册表,请创建新的容器注册表。 - 包含要缓存工件的现有上游 ACR 实例(本文中称为
UpstreamRegistry)。 - Azure CLI 2.85.0 或更高版本。 可以使用Azure CLI本地安装。 若要确认版本,请运行
az --version。 若要安装或升级,请参阅安装 Azure CLI。
- Bicep 工具 (适用于 Bicep 部署)。
配置项目缓存
创建用户分配的托管标识
ACR 到 ACR 缓存使用用户分配的托管标识(而不是 密钥保管库 中存储的用户名和密码凭据)向上游注册表进行身份验证。 需要创建托管标识,并向其授予对上游注册表的访问权限。
创建用户分配的托管标识:
az identity create \ --name MyACRCacheIdentity \ --resource-group MyResourceGroup获取托管身份的主体 ID 和资源 ID:
IDENTITY_PRINCIPAL_ID=$(az identity show \ --name MyACRCacheIdentity \ --resource-group MyResourceGroup \ --query 'principalId' \ -o tsv) IDENTITY_RESOURCE_ID=$(az identity show \ --name MyACRCacheIdentity \ --resource-group MyResourceGroup \ --query 'id' \ -o tsv)
在上游注册表上分配拉取权限
上游注册表必须 启用 ABAC(Attribute-Based 访问控制), 以便你可以分配精细的存储库权限。 托管标识需要上游注册表上的 容器注册表存储库读取者 角色,该角色的范围限定为要缓存的特定存储库。
注释
如果上游注册表尚未启用 ABAC,请运行 az acr update --name UpstreamRegistry --role-assignment-mode rbac-abac。
获取上游注册表的资源 ID:
UPSTREAM_ID=$(az acr show \ --name UpstreamRegistry \ --query 'id' \ -o tsv)将 容器注册表存储库读取者 角色分配给上游注册表上的托管标识:
az role assignment create \ --role "Container Registry Repository Reader" \ --assignee "$IDENTITY_PRINCIPAL_ID" \ --scope "$UPSTREAM_ID/repositories/myapp"
创建缓存规则
创建一个缓存规则,用于将项目从上游注册表拉取到下游注册表。
运行
az acr cache create以创建缓存规则。 使用--identity参数指定用户分配的托管标识,以便通过上游注册表进行身份验证:az acr cache create \ -r MyRegistry \ -n MyRule \ -s upstreamregistry.azurecr.cn/myapp \ -t myapp \ --identity "$IDENTITY_RESOURCE_ID"运行
az acr cache show以验证缓存规则:az acr cache show -r MyRegistry -n MyRule
验证缓存
配置缓存规则并分配所需权限后,从下游注册表拉取映像以验证缓存是否正常工作。
docker pull myregistry.azurecr.cn/myapp:latest
首次拉取会从上游注册表检索镜像,并将其缓存在下游注册表中。 随后的拉取操作将直接从下游注册表的缓存中获取。
清理资源
不再需要缓存资源时,请删除缓存规则、角色分配和托管标识。
通过运行
az acr cache delete以下命令删除缓存规则:az acr cache delete -r MyRegistry -n <cache-rule-name>替换
<cache-rule-name>为创建缓存规则时使用的名称(例如,MyRule用于Azure CLI选项卡或cacheRule用于Bicep选项卡)。删除上游注册表上的角色分配:
UPSTREAM_ID=$(az acr show --name UpstreamRegistry --query 'id' -o tsv) IDENTITY_PRINCIPAL_ID=$(az identity show \ --name MyACRCacheIdentity \ --resource-group MyResourceGroup \ --query 'principalId' \ -o tsv) az role assignment delete \ --role "Container Registry Repository Reader" \ --assignee "$IDENTITY_PRINCIPAL_ID" \ --scope "$UPSTREAM_ID/repositories/myapp"删除用户分配的托管标识:
az identity delete \ --name MyACRCacheIdentity \ --resource-group MyResourceGroup注释
在删除身份之前,请确保该身份未被任何其他资源使用。
后续步骤
- 了解如何排查工件缓存的问题。
- 了解 工件缓存概述。
- 了解如何使用 Azure 门户启用工件缓存。