手动将容器注册表移到另一区域

你可能需要将 Azure 容器注册表从一个 Azure 区域移到另一个 Azure 区域。 例如,你在一个不同的区域中运行开发管道或托管新的部署目标,并希望提供附近区域的注册表。

尽管 Azure 资源转移器无法自动对 Azure 容器注册表执行移动操作,但你可以手动将容器注册表移到另一个区域:

  • 将注册表设置导出到资源管理器模板
  • 使用模板在不同的 Azure 区域中部署注册表
  • 将源注册表中的注册表内容导入到目标注册表

注意

如果需要在多个 Azure 区域中分布相同的容器映像,则 Azure 容器注册表还支持异地复制。 通过对注册表(需要高级服务层)进行异地复制,可以使用单个注册表的相同映像和标记名称为多个区域提供服务。

先决条件

Azure CLI

  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

注意事项

  • 使用本文中的步骤将注册表移到同一订阅中的不同区域。 可能需要进行其他配置才能将注册表移动到同一 Active Directory 租户中的其他 Azure 订阅。
  • 导出和使用资源管理器模板可帮助重新创建许多注册表设置。 可以编辑模板以配置更多设置,或者在创建后更新目标注册表。
  • 目前,Azure 容器注册表不支持将注册表移动到其他 Active Directory 租户。 此限制适用于使用客户管理的密钥加密的注册表和未加密的注册表。
  • 如果无法移动注册表(如本文所述),可以创建新注册表,手动重新创建设置,然后在目标注册表中导入注册表内容
  • 可以查看将注册表资源移动到同一订阅中的新资源组或将资源移动到新订阅的步骤。

从源注册表导出模板

使用 Azure 门户、Azure CLI、Azure PowerShell 或其他 Azure 工具导出资源管理器模板。 若要使用 Azure 门户:

  1. Azure 门户中,导航到你的源注册表。

  2. 在菜单中的“自动化”下,选择“导出模板”>“下载” 。

    Export template for container registry

在新区域中重新部署目标注册表

修改模板

检查下载的模板 JSON 文件中的注册表属性,并做出必要的更改。 至少:

  • 将注册表名称的 defaultValue 更改为目标注册表的所需名称
  • location 更新为目标注册表的所需 Azure 区域
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "registries_myregistry_name": {
            "defaultValue": "myregistry",
            "type": "String"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.ContainerRegistry/registries",
            "apiVersion": "2020-11-01-preview",
            "name": "[parameters('myregistry_name')]",
            "location": "chinaeast2",
        ...
        }
    ]
}

有关详细信息,请参阅从 Azure 门户使用导出的模板模板参考

重要

如果你要使用客户管理的密钥来加密目标注册表,请确保使用所需托管标识、密钥保管库和密钥的设置更新模板。 只能在部署注册表时启用客户管理的密钥。

有关详细信息,请参阅使用客户管理的密钥加密注册表

创建资源组

使用 az group create 为目标注册表创建资源组。 以下示例在“chinaeast2”位置创建名为“myResourceGroup”的资源组。

az group create --name myResourceGroup --location chinaeast2

在新区域中部署目标注册表

使用 az deployment group create 命令通过模板部署目标注册表:

az deployment group create --resource-group myResourceGroup \
   --template-file template.json --name mydeployment

注意

如果在部署过程中看到错误,可能需要更新模板文件中的特定配置,然后重试该命令。

在目标注册表中导入注册表内容

在目标区域中创建注册表后,使用 az acr import 命令或等效的 PowerShell 命令 Import-AzContainerImage,将源注册表中的映像以及你要保留的其他项目导入到目标注册表。 有关命令示例,请参阅将容器映像导入到容器注册表

  • 使用 Azure CLI 命令 az acr repository listaz acr repository show-tags 或等效的 Azure PowerShell 命令来帮助枚举源注册表的内容。
  • 针对单个项目运行 import 命令,或编写脚本以针对一系列项目运行该命令。

以下示例 Azure CLI 脚本枚举源存储库和标记,然后将项目导入到同一 Azure 订阅中的目标注册表。 根据需要进行修改,以导入特定的存储库或标记。 若要从其他订阅或租户中的注册表导入,请参阅将容器映像导入容器注册表中的示例。

#!/bin/bash
# Modify registry names for your environment
SOURCE_REG=myregistry
TARGET_REG=targetregistry

# Get list of source repositories
REPO_LIST=$(az acr repository list \
    --name $SOURCE_REG --output tsv)

# Enumerate tags and import to target registry
for repo in $REPO_LIST; do
    TAGS_LIST=$(az acr repository show-tags --name $SOURCE_REG --repository $repo --output tsv);
    for tag in $TAGS_LIST; do
        echo "Importing $repo:$tag";
        az acr import --name $TARGET_REG --source $SOURCE_REG.azurecr.cn/$repo":"$tag;
    done
done

验证目标注册表

确认目标注册表中包含以下信息:

  • 注册表设置,例如注册表名称、服务层级、公共访问权限和复制内容
  • 要保留的内容的存储库和标记。

其他配置

  • 如果需要,请手动配置目标注册表中的设置,例如专用终结点、IP 访问规则和托管标识。

  • 将开发和部署系统更新为使用目标注册表而不是源注册表。

  • 更新任何客户端防火墙规则以允许访问目标注册表。

删除原始注册表

成功部署了目标注册表、迁移了内容并验证了注册表设置后,可以删除源注册表。

后续步骤