将工件转移到另一个注册表

什么是 ACR 传输?

ACR 传输是 Azure 容器注册表(Azure Container Registry)的一项功能,用于在可能驻留在不同云或物理环境断开的注册表之间传输容器映像和其他 OCI 工件。 传输的工作原理是使用中间存储帐户:

  • 将源注册表中的项目导出到源存储帐户中的 blob
  • Blob 从源存储帐户复制到目标存储帐户(如果需要,跨网络边界)
  • 目标存储帐户中的 Blob 作为目标注册表中的工件被导入。

可以设置导入管道,以在项目 Blob 到达目标存储时自动触发。 这使得 ACR 传输非常适合物理隔离或跨云方案,在这些情况下,直接的注册表到注册表连接不可用。

工作原理 - 管道和管道运行

ACR 传输围绕三种资源类型构建,这些资源类型共同在注册表之间复制项目:

  • ExportPipeline - 与源注册表和存储帐户关联的长期资源。 它定义写入导出的项目的位置(存储 Blob 容器),以及管道如何对存储进行身份验证。

  • ImportPipeline - 与目标注册表和存储帐户关联的长期资源。 它定义从何处读取工件 Blob 以及管道如何进行存储身份验证。 默认情况下,导入管道包含一个源触发器,该触发器会在新 Blob 到达时自动将其导入。

  • PipelineRun - 触发 ExportPipeline 或 ImportPipeline 的一次性执行资源。 对于导出,可以指定要导出的制品(通过标记或摘要)。 对于导入,请指定要导入的 Blob 数据对象。 当前每个 PipelineRun 最多可传输 50 个工件。

将管道视为配置,将管道运行视为执行。

重要

ACR 传输由于技术限制支持层大小高达 8 GB 的工件。

存储访问模式

ACR 传输支持两种存储访问模式,用于对存储帐户的管道进行身份验证:

  • SAS 令牌 - 管道使用作为机密存储在Azure Key Vault中的共享访问签名(SAS)令牌向存储帐户进行身份验证。 管道的托管标识从密钥保管库读取 SAS 令牌机密。

  • Managed Identity - 管道使用 Microsoft Entra 的托管标识(系统分配或用户分配)直接向存储帐户进行身份验证。 存储访问不需要Key Vault或 SAS 令牌。

创建管道时,使用参数 --storage-access-mode(CLI)或属性 storageAccessMode(ARM 模板)来指定模式。 选择的模式决定了需要满足以下先决条件。

体系结构关系图

下图说明了导出/导入管道设置的体系结构。 此示例演示如何通过跨云或跨租户映像传输方案的中间存储帐户传输映像,而无需直接进行 ACR 到 ACR 访问。

托管标识模式:

Source Cloud                                                                     Target Cloud
+-------------------------------------------------+                              +-------------------------------------------------+
|                                                 |                              |                                                 |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|  | Source ACR                        |          |                              |          | Target ACR                        |  |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|                   |                             |                              |                       ^                         |
|                   v                             |                              |                       |                         |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|  | ExportPipeline                    |          |                              |          | ImportPipeline                    |  |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|                   |                             |                              |                       ^                         |
|                   |                             |                              |                       |                         |
|                   |                             |                              |                       |                         |
|                   | Pipeline accesses           |                              |                       | Pipeline accesses       |
|                   | storage account directly    |                              |                       | storage account         |
|                   | (using Pipeline's Managed   |                              |                       | directly (using         |
|                   | Identity) to export image   |                              |                       | Pipeline's Managed      |
|                   |                             |                              |                       | Identity) to import     |
|                   | RBAC: Storage Blob Data     |                              |                       | image                   |
|                   | Contributor                 |                              |                       |                         |
|                   |                             |                              |                       | RBAC: Storage Blob Data |
|                   |                             |                              |                       | Contributor             |
|                   |                             |                              |                       |                         |
|                   v                             |                              |                       |                         |
|  +-----------------------------------+          |      Cross-Cloud or          |          +-----------------------------------+  |
|  | Storage Account                   |----------|----- Cross-Tenant -----------|--------->| Storage Account                   |  |
|  | (Blob Container)                  |          |      Syndication Process     |          | (Blob Container)                  |  |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|                                                 |                              |                                                 |
+-------------------------------------------------+                              +-------------------------------------------------+

SAS 令牌模式:

Source Cloud                                                                     Target Cloud
+-------------------------------------------------+                              +-------------------------------------------------+
|                                                 |                              |                                                 |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|  | Source ACR                        |          |                              |          | Target ACR                        |  |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|                   |                             |                              |                       ^                         |
|                   v                             |                              |                       |                         |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|  | ExportPipeline                    |          |                              |          | ImportPipeline                    |  |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|               |           |                     |                              |                   ^           |                 |
|               |           |                     |                              |                   |           |                 |
|               |           | Access Key Vault    |                              |                   |           | Access Key      |
|               |           | (using Pipeline's   |                              |                   |           | Vault (using    |
|               |           | Managed Identity)   |                              |                   |           | Pipeline's      |
|               |           | to fetch Storage    |                              |                   |           | Managed         |
|               |           | SAS Secret          |                              |                   |           | Identity) to    |
|               |           v                     |                              |                   |           | fetch Storage   |
|               |  +------------------------+     |                              |                   |           | SAS Secret      |
|               |  | Source Key Vault       |     |                              |                   |           v                 |
|               |  | (SAS Token Secret)     |     |                              |                   |  +------------------------+ |
|               |  +------------------------+     |                              |                   |  | Target Key Vault       | |
|               |                                 |                              |                   |  | (SAS Token Secret)     | |
|               | Pipeline accesses storage       |                              |                   |  +------------------------+ |
|               | account using SAS Secret to     |                              |                   |                             |
|               | export image                    |                              |                   | Pipeline accesses storage   |
|               |                                 |                              |                   | account using SAS Secret    |
|               |                                 |                              |                   | to import image             |
|               |                                 |                              |                   |                             |
|               v                                 |                              |                   |                             |
|  +-----------------------------------+          |      Cross-Cloud or          |          +-----------------------------------+  |
|  | Storage Account                   |----------|----- Cross-Tenant -----------|--------->| Storage Account                   |  |
|  | (Blob Container)                  |          |      Syndication Process     |          | (Blob Container)                  |  |
|  +-----------------------------------+          |                              |          +-----------------------------------+  |
|                                                 |                              |                                                 |
+-------------------------------------------------+                              +-------------------------------------------------+

考虑您的用例

传输非常适用于在物理隔离的云中,通过各云中的存储帐户,实现两个 Azure 容器注册表之间内容的复制。

对于其他方案,请考虑以下替代方法:

  • 如果要从连接的云中的容器注册表(包括 Docker Hub 和其他云供应商)复制映像,建议使用 image import
  • 如果要缓存公共注册表中的映像以提高拉取性能,请参阅 Artifact 缓存

先决条件

常见先决条件(两种存储访问模式)

无论选择哪种存储访问模式,都需要以下资源:

  • 容器注册表 - 需要具有要传输项目的现有源注册表以及目标注册表。 这两个注册表必须位于 高级 服务层中。 ACR 传输适用于跨越物理上断开的云进行移动。 若要进行测试,源注册表和目标注册表可以位于相同或不同的Azure订阅、Microsoft Entra租户或云中。

    有关注册表服务层和限制的信息,请参阅 Azure 容器注册表层。 如果需要创建注册表,请参阅 Quickstart:使用 Azure CLI

  • 存储帐户 - 在选择的订阅和位置中创建源和目标存储帐户。 出于测试目的,可使用与源和目标注册表相同的一个或多个订阅。 对于跨云方案,通常在每个云中创建一个单独的存储帐户。

    如果需要,请使用 Azure CLI 或其他工具创建存储帐户。 在每个帐户中创建用于传输项目的 blob 容器。 例如,创建一个名为 transfer 的容器。

SAS 令牌模式的其他先决条件

如果计划使用 SAS 令牌 存储访问模式,则还需要:

  • 密钥保管库 - 创建源和目标密钥保管库来存储 SAS 令牌机密。 在源和目标注册表所在的同一Azure订阅或订阅中创建它们。 为便于演示,本文所用的模板和命令还假定源密钥保管库和目标密钥保管库分别与源注册表和目标注册表位于同一资源组。 使用公共资源组并不是必需的,但这样可简化本文所用的模板和命令。

    如果需要,请使用 Azure CLI 或其他工具创建密钥保管库。

  • SAS 令牌 - 需要为存储帐户容器生成 SAS 令牌并将其存储在密钥保管库中。 有关详细步骤,请参阅下面的 创建和存储 SAS 令牌

  • Key Vault 访问 - 管道的托管标识必须拥有 Key Vault 的 secret get 访问策略权限才能读取 SAS 令牌机密。

托管标识模式的其他先决条件

如果计划使用 托管标识 存储访问模式,则还需要:

  • RBAC 角色分配 - 管道的托管标识(系统分配或用户分配)必须在存储帐户上具有相应的 RBAC 角色。 例如,分配 Storage Blob Data Contributor 角色以允许管道读取和写入 BLOB 数据对象。

  • API 版本要求 - 托管标识模式需要 API 版本 2025-06-01-preview 或更高版本(对于 ARM 模板)或 Azure CLI 扩展acrtransfer 2.0.0 或更高版本(对于 CLI)。

注释

使用托管标识模式时,无需 Key Vault 和 SAS 令牌秘密即可访问存储帐户。 管道使用其托管标识直接对存储帐户进行身份验证。

环境变量

有关本文中的命令示例,请为源环境和目标环境设置以下环境变量。 所有示例的格式都适用于 Bash shell。

SOURCE_RG="<source-resource-group>"
TARGET_RG="<target-resource-group>"
SOURCE_KV="<source-key-vault>"  # Only needed for SAS Token mode
TARGET_KV="<target-key-vault>"  # Only needed for SAS Token mode
SOURCE_SA="<source-storage-account>"
TARGET_SA="<target-storage-account>"

使用须知

  • ExportPipeline 和 ImportPipeline 通常位于与源云和目标云关联的不同Microsoft Entra租户中。 此方案需要单独的托管标识和密钥保管库(使用 SAS 令牌模式)来导出和导入资源。 出于测试目的,可以将这些资源放在同一个云中,以共享标识。
  • 默认情况下,ExportPipeline 和 ImportPipeline 模板都启用系统分配的托管标识。 这些模板还支持你提供的用户分配标识。
    • 使用 SAS 令牌模式时,标识从密钥保管库读取 SAS 令牌机密
    • 使用 托管标识模式时,标识会直接对存储帐户进行身份验证。

创建和存储 SAS 令牌

注释

仅当使用 SAS 令牌存储访问模式时,才需要以下 SAS 令牌 设置。 如果计划使用 托管标识 存储访问模式,请跳过本部分,并继续执行 后续步骤

传输使用共享访问签名 (SAS) 令牌来访问源和目标环境中的存储帐户。 按照以下部分的说明生成并存储令牌。

重要

虽然 ACR 传输可以使用存储在 Key Vault 机密中的手动生成的 SAS 令牌,但对于生产工作负荷,我们强烈建议改用 Key Vault 托管存储 SAS 定义机密。

生成用于导出操作的 SAS 令牌

运行 az storage container generate-sas 命令,为源存储帐户中的容器生成 SAS 令牌,用于项目导出。

推荐的令牌权限:读取、写入、列出、添加。

在下面的示例中,将命令输出分配给 EXPORT_SAS 环境变量,以“?”字符作为前缀。 更新环境的 --expiry 值:

EXPORT_SAS=?$(az storage container generate-sas \
  --name transfer \
  --account-name $SOURCE_SA \
  --expiry 2027-01-01 \
  --permissions alrw \
  --https-only \
  --output tsv)

存储用于导出的 SAS 令牌

使用 az keyvault secret set 将 SAS 令牌存储在源 Azure 密钥保管库中:

az keyvault secret set \
  --name acrexportsas \
  --value $EXPORT_SAS \
  --vault-name $SOURCE_KV

生成用于导入的 SAS 令牌

运行 az storage container generate-sas 命令,为目标存储帐户中的容器生成 SAS 令牌,用于项目导入。

推荐的令牌权限:读取、删除、列出

在下面的示例中,将命令输出分配给 IMPORT_SAS 环境变量,以“?”字符作为前缀。 更新环境的 --expiry 值:

IMPORT_SAS=?$(az storage container generate-sas \
  --name transfer \
  --account-name $TARGET_SA \
  --expiry 2027-01-01 \
  --permissions dlr \
  --https-only \
  --output tsv)

存储用于导入的 SAS 令牌

使用 az keyvault secret set 将 SAS 令牌存储在目标 Azure 密钥保管库中:

az keyvault secret set \
  --name acrimportsas \
  --value $IMPORT_SAS \
  --vault-name $TARGET_KV

后续步骤

完成先决条件后,请按照以下教程之一创建 ACR 传输管道和管道运行:

如果遇到问题,请参阅 ACR 传输故障排除 以获取指导。