使用 Az CLI 进行 ACR 传输

本文介绍如何通过 acrtransfer Az CLI 扩展使用 ACR 传输功能。

满足先决条件

在尝试本文中的操作之前,请完成此处所述的先决条件。 这意味着:

  • 在两个云中都有一个现有的高级 SKU 注册表。
  • 在两个云中都有一个现有的存储帐户容器。
  • 在两个云中都有一个现有的密钥保管库,其中包含具有必要权限的有效 SAS 令牌。
  • 在两个云中都安装了最新版本的 Az CLI。

安装 Az CLI 扩展

在 AzureCloud 中,可以通过以下命令安装扩展:

az extension add --name acrtransfer

在 AzureCloud 和其他云中,可以直接从公共存储帐户容器安装 Blob。 Blob 托管在 acrtransferext 存储帐户、dist 容器、acrtransfer-1.0.0-py2.py3-none-any.wh Blob 中。 可能需要根据所在的云更改存储 URI 后缀。 以下内容将在 AzureCloud 中安装:

az extension add --source https://acrtransferext.blob.core.windows.net/dist/acrtransfer-1.0.0-py2.py3-none-any.whl

使用 acrtransfer Az CLI 扩展创建 ExportPipeline

使用 acrtransfer Az CLI 扩展为 AzureChinaCloud 容器注册表创建 ExportPipeline 资源。

创建不含选项和系统分配标识的导出管道:

az acr export-pipeline create \
--resource-group $MyRG \
--registry $MyReg \
--name $MyPipeline \
--secret-uri https://$MyKV.vault.azure.cn/secrets/$MySecret \
--storage-container-uri https://$MyStorage.blob.core.chinacloudapi.cn/$MyContainer

创建含所有可能选项和用户分配标识的导出管道:

az acr export-pipeline create \
--resource-group $MyRG \
--registry $MyReg \
--name $MyPipeline \
--secret-uri https://$MyKV.vault.azure.cn/secrets/$MySecret \
--storage-container-uri https://$MyStorage.blob.core.chinacloudapi.cn/$MyContainer \
--options OverwriteBlobs ContinueOnErrors \
--assign-identity /subscriptions/$MySubID/resourceGroups/$MyRG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$MyIdentity

导出选项

导出管道的 options 属性支持可选的布尔值。 建议使用以下值:

参数 Value
options OverwriteBlobs - 覆盖现有目标 blob
ContinueOnErrors - 如果一个项目导出失败,则在源注册表中继续导出其余项目。

向 ExportPipeline 标识授予密钥保管库策略访问权限

如果创建了含用户分配标识的管道,只需向此用户分配的标识授予对密钥保管库的 secret get 访问策略权限。

如果创建了含系统分配标识的管道,则首先需要检索系统已分配给管道资源的 principalId。

运行以下命令以检索管道资源:

az acr export-pipeline show --resource-group $MyRG --registry $MyReg --name $MyPipeline

在此输出中,你需要复制 principalId 字段中的值。

然后,运行以下命令,为该主体授予对密钥保管库的相应 secret get 访问策略权限。

az keyvault set-policy --name $MyKeyvault --secret-permissions get --object-id $MyPrincipalID

使用 acrtransfer Az CLI 扩展创建 ImportPipeline

使用 acrtransfer Az CLI 扩展在目标容器注册表中创建 ImportPipeline 资源。 默认情况下,当附加的存储帐户容器接收到新的项目 Blob 时,管道会自动创建一个 Import PipelineRun。

创建不含选项和系统分配标识的导入管道:

az acr import-pipeline create \
--resource-group $MyRG \
--registry $MyReg \
--name $MyPipeline \
--secret-uri https://$MyKV.vault.azure.cn/secrets/$MySecret \
--storage-container-uri https://$MyStorage.blob.core.chinacloudapi.cn/$MyContainer

创建包含一个导入管道,其中包含所有可能的选项和一个用户分配标识,并禁用源触发器:

az acr import-pipeline create \
--resource-group $MyRG \
--registry $MyReg \
--name $MyPipeline \
--secret-uri https://$MyKV.vault.azure.cn/secrets/$MySecret \
--storage-container-uri https://$MyStorage.blob.core.chinacloudapi.cn/$MyContainer \
--options DeleteSourceBlobOnSuccess OverwriteTags ContinueOnErrors \
--assign-identity /subscriptions/$MySubID/resourceGroups/$MyRG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$MyIdentity \
--source-trigger-enabled False

导入选项

导入管道的 options 属性支持可选的布尔值。 建议使用以下值:

参数 Value
options OverwriteTags - 覆盖现有目标标记
DeleteSourceBlobOnSuccess - 成功导入到目标注册表后删除源存储 blob
ContinueOnErrors - 如果一个项目导入失败,则在目标注册表中继续导入其余项目。

向 ImportPipeline 标识授予密钥保管库策略的访问权限

如果创建了含用户分配标识的管道,只需向此用户分配的标识授予对密钥保管库的 secret get 访问策略权限。

如果创建了含系统分配标识的管道,则首先需要检索系统已分配给管道资源的 principalId。

运行以下命令以检索管道资源:

az acr import-pipeline show --resource-group $MyRG --registry $MyReg --name $MyPipeline

在此输出中,你需要复制 principalId 字段中的值。

然后,运行以下命令,为该主体授予对密钥保管库的相应 secret get 访问策略。

az keyvault set-policy --name $MyKeyvault --secret-permissions get --object-id $MyPrincipalID

通过 acrtransfer Az CLI 扩展为导出创建 PipelineRun

使用 acrtransfer Az CLI 扩展为容器注册表创建 PipelineRun 资源。 此资源运行之前创建的 ExportPipeline 资源,并将容器注册表中的指定项目作为 Blob 导出到存储帐户容器。

创建导出管道运行:

az acr pipeline-run create \
--resource-group $MyRG \
--registry $MyReg \
--pipeline $MyPipeline \
--name $MyPipelineRun \
--pipeline-type export \
--storage-blob $MyBlob \
--artifacts hello-world:latest hello-world@sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 \
--force-redeploy

如果重新部署具有相同属性的 PipelineRun 资源,则必须使用 --force-redeploy 标志。

导出项目可能需要几分钟。 部署成功完成后,请在源存储帐户的容器中列出导出的 Blob,以验证项目导出。 例如,运行 az storage blob list 命令:

az storage blob list --account-name $MyStorageAccount --container $MyContainer --output table

跨域传输 Blob

在大多数用例中,现在你将使用跨域解决方案或其他方法将 Blob 从源域中的存储帐户(与导出管道关联的存储帐户)传输到目标域中的存储帐户(与导入管道关联的存储帐户)。 这时,我们将假设 Blob 已到达与导入管道关联的目标域存储帐户。

触发 ImportPipeline 资源

如果在创建导入管道时未使用 --source-trigger-enabled False 参数,则会在 Blob 到达存储帐户容器后的 15 分钟内触发管道。 导入项目可能需要几分钟。 导入成功完成后,请列出在目标容器注册表中导入的存储库上的标签,以验证项目导入。 例如,运行 az acr repository show-tags

az acr repository show-tags --name $MyRegistry --repository $MyRepository

注意

源触发器将仅导入上次修改时间为过去 60 天内的 Blob。 如果打算使用源触发器导入早于该时间的 blob,请通过将 blob 元数据添加到 blob 来刷新 blob 的上次修改时间,或者使用手动创建的管道运行导入它们。

如果在创建 ImportPipeline 时使用了 --source-trigger-enabled False 参数,则需要手动创建 PipelineRun,如下一部分所示。

通过 acrtransfer Az CLI 扩展为导入创建 PipelineRun

使用 acrtransfer Az CLI 扩展为容器注册表创建 PipelineRun 资源。 此资源运行之前创建的 ImportPipeline 资源,并将指定的 Blob 从存储帐户导入到容器注册表中。

创建导入管道运行:

az acr pipeline-run create \
--resource-group $MyRG \
--registry $MyReg \
--pipeline $MyPipeline \
--name $MyPipelineRun \
--pipeline-type import \
--storage-blob $MyBlob \
--force-redeploy

如果重新部署具有相同属性的 PipelineRun 资源,则必须使用 --force-redeploy 标志。

导入项目可能需要几分钟。 导入成功完成后,请在目标容器注册表中列出存储库,以验证项目导入。 例如,运行 az acr repository show-tags

az acr repository show-tags --name $MyRegistry --repository $MyRepository

删除 ACR 传输资源

删除 ExportPipeline:

az acr export-pipeline delete --resource-group $MyRG --registry $MyReg --name $MyPipeline

删除 ImportPipeline:

az acr import-pipeline delete --resource-group $MyRG --registry $MyReg --name $MyPipeline

删除 PipelineRun 资源。 请注意,这不会反转 PipelineRun 执行的操作。 这更像是删除 PipelineRun 的日志。

az acr pipeline-run delete --resource-group $MyRG --registry $MyReg --name $MyPipelineRun

ACR 传输故障排除

查看 ACR 传输故障排除以获取故障排除指南。

后续步骤