你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
可以轻松将容器映像导入(复制)到 Azure 容器注册表中,无需使用 Docker 命令。 例如,将映像从开发注册表导入到生产注册表,或者从公共注册表复制基础映像。
Azure 容器注册表可灵活应对许多常见方案,以便从现有注册表复制映像和其他工件:
从公共注册表导入映像
从其他 Azure 容器映像(在同一个或不同的 Azure 订阅或租户中)导入映像或 OCI 工件(包括 Helm 3 图表)
从非 Azure 专用容器注册表导入
与使用 Docker CLI 命令相比,将映像导入到 Azure 容器注册表具有以下优点:
如果你的客户端环境不需要本地 Docker 安装,则可导入任何容器映像,无需考虑受支持的 OS 类型。
如果导入多体系结构映像(例如正式的 Docker 映像),则会复制清单列表中指定的所有体系结构和平台的映像。
如果有权访问目标注册表,则不需要注册表的公共终结点。
重要说明
- 导入映像要求外部注册表支持 RFC 7233。 建议使用支持 RFC 7233 范围的注册表,同时将 az acr import 命令与注册表 URI 配合使用以避免失败。
限制
- 对于导入的映像,清单的最大数目为 50。
若要导入容器映像,本文要求在 Azure Cloud Shell 中或本地(建议使用 2.0.55 或更高版本)运行 Azure CLI。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
注意
如果需要在多个 Azure 区域中分布相同的容器映像,则 Azure 容器注册表还支持异地复制。 通过对注册表(需要高级服务层)进行异地复制,可以使用单个注册表的相同映像和标记名称为多个区域提供服务。
重要说明
自 2021 年 1 月起,Azure 两个容器注册表之间的映像导入机制发生了变化:
Prerequisites
如果还没有 Azure 容器注册表,请创建注册表。 有关步骤,请参阅快速入门:使用 Azure CLI 创建专用容器注册表。
若要将图片导入 Azure 容器注册表,您的身份必须具有在目标注册表(Container Registry Data Importer and Data Reader 角色)中触发导入的权限。 请参阅 Azure 容器注册表 Entra 权限和角色概述。
从公共注册表导入
重要说明
要从公共注册表向网络受限的 Azure 容器注册表导入内容,需要受限注册表才能允许受信任的服务进行访问,从而绕过网络。默认情况下,此设置处于启用状态,即允许导入。 如果在通过专用终结点或注册表防火墙规则新创建的注册表中未启用此设置,导入将会失败。
从 Docker 中心导入
例如,使用 az acr import 命令将 Docker Hub 中的多架构 hello-world:latest 镜像导入到名为 myregistry 的注册表中。 由于 hello-world 是来自 Docker 中心的官方映像,因此该映像位于默认的 library 存储库中。
--source 映像参数的值中包含存储库名称和(可选)标记。 (可以选择性根据映像的清单摘要而不是标签来标识映像,这确保映像为特定版本。)
az acr import \
--name myregistry \
--source docker.io/library/hello-world:latest \
--image hello-world:latest
可以通过运行 az acr manifest list-metadata 命令来验证多个清单是否与此映像关联:
az acr manifest list-metadata \
--name hello-world \
--registry myregistry
若要按摘要方式导入项目,而不添加标记,请执行以下操作:
az acr import \
--name myregistry \
--source docker.io/library/hello-world@sha256:abc123 \
--repository hello-world
如有 Docker Hub 帐户,我们建议你在从 Docker Hub 导入映像时使用该帐户的凭据。 将 Docker Hub 用户名和密码或个人访问令牌作为参数传递给 az acr import。 以下示例使用 Docker Hub 凭据从 Docker Hub 中的 tensorflow 存储库导入公共映像:
az acr import \
--name myregistry \
--source docker.io/tensorflow/tensorflow:latest-gpu \
--image tensorflow:latest-gpu
--username <Docker Hub user name>
--password <Docker Hub token>
从 Microsoft 容器注册表导入
例如,从 Microsoft Container Registry 中的 ltsc2019 存储库导入 windows Windows Server Core 映像。
az acr import \
--name myregistry \
--source mcr.microsoft.com/windows/servercore:ltsc2019 \
--image servercore:ltsc2019
从同一 AD 租户中的 Azure 容器注册表导入
可以使用集成的 Microsoft Entra 权限从同一 AD 租户中的 Azure 容器注册表导入映像。
你的标识必须具有查看和拉取源注册表中的映像、标记以及 OCI 引用来源的权限(在源注册表中分配了
Container Registry Data Importer and Data Reader角色)。你的标识还必须具有读取映像和触发目标注册表导入的权限(在目标注册表中分配了
Container Registry Data Importer and Data Reader角色)。注册表可以位于同一 Active Directory 租户的同一或不同 Azure 订阅中。
已禁用对源注册表的公共访问。 如果禁用公共访问,请按资源 ID 而不是按注册表登录服务器名称指定源注册表。
具有专用终结点的源注册表和/或目标注册表或者注册表防火墙规则必须确保受限注册表允许受信任的服务访问网络。
从同一订阅的注册表中导入
例如,在同一 Azure 订阅中,将 aci-helloworld:latest 映像从源注册表 mysourceregistry 导入到 myregistry。
以下示例将 aci-helloworld:latest 映像从源注册表 mysourceregistry 导入到 myregistry 中,在该源注册表中禁止访问注册表的公共终结点。 使用 --registry 参数提供源注册表的资源 ID。 注意,--source 参数只指定源存储库和标签,而非注册表登录服务器名称。
请注意,需要 --registry <source-registry-resource-id> 标志才能对源注册表使用 Entra 身份验证。
az acr import \
--name myregistry \
--source aci-helloworld:latest \
--image aci-helloworld:latest \
--registry /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/sourceResourceGroup/providers/Microsoft.ContainerRegistry/registries/mysourceregistry
从不同订阅的注册表导入
注意
要将映像从一个注册表导入另一个注册表,源注册表和目标注册表必须确保两个区域都在订阅的资源提供程序下注册了 Azure 容器注册表 (ACR)。
在下面的示例中,mysourceregistry 与 myregistry 处于同一 Active Directory 租户的不同订阅中。 使用 --registry 参数提供源注册表的资源 ID。 注意,--source 参数只指定源存储库和标签,而非注册表登录服务器名称。
az acr import \
--name myregistry \
--source aci-helloworld:latest \
--image aci-hello-world:latest \
--registry /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/sourceResourceGroup/providers/Microsoft.ContainerRegistry/registries/mysourceregistry
使用服务主体凭据从注册表导入
若要从无法通过集成的 Active Directory 权限访问的注册表中进行导入操作,可以使用服务主体凭证(如有)来访问源注册表。 提供对源注册表具有正确角色分配访问权限的 Microsoft Entra 服务主体 的 appID 和密码。
- 对于 Microsoft Entra 服务主体,请确保已应用
Container Registry Repository Reader(适用于已启用 ABAC 的注册表)或AcrPull(适用于非 ABAC 注册表)。
服务主体适用于需将映像导入到注册表的生成系统和其他无人参与系统。
az acr import \
--name myregistry \
--source sourceregistry.azurecr.io/sourcerrepo:tag \
--image targetimage:tag \
--username <SP_App_ID> \
--password <SP_Passwd>
从不同 AD 租户中的 Azure 容器注册表导入
若要从不同 Microsoft Entra 租户中的 Azure 容器注册表导入,请通过登录服务器名称指定源注册表,并提供支持对注册表进行拉取访问的凭据。
- 不支持通过公共访问禁用的注册表进行跨租户导入。
使用用户名和密码进行跨租户导入
例如,使用非 Microsoft Entra 存储库范围内的令牌和密码,或者使用向源注册表正确分配角色的 Microsoft Entra 服务主体的 appID 和密码。
- 对于 Microsoft Entra 服务主体,请确保在源注册表上,
Container Registry Repository Reader已分配到(对于 已启用 ABAC 的注册表),或者AcrPull已分配到(对于非 ABAC 注册表)。
az acr import \
--name myregistry \
--source sourceregistry.azurecr.io/sourcerrepo:tag \
--image targetimage:tag \
--username <SP_App_ID> \
--password <SP_Passwd>
使用访问令牌进行跨租户导入
- 不支持通过公共访问禁用的注册表进行跨租户导入。
若要使用源租户中具有注册表权限的标识访问源注册表,可以获取访问令牌:
# Login to Azure CLI with the identity, for example a user-assigned managed identity
az login --identity --username <identity_ID>
# Get access token returned by `az account get-access-token`
az account get-access-token
在目标租户中,将访问令牌作为密码传递给 az acr import 命令。 源注册表指定登录服务器名称。 请注意,此命令中不需要用户名:
az acr import \
--name myregistry \
--source sourceregistry.azurecr.io/sourcerrepo:tag \
--image targetimage:tag \
--password <access-token>
从非 Azure 专用容器注册表导入
通过指定启用对注册表的拉取访问的凭据,从非 Azure 专用注册表导入映像。 例如,从专用 Docker 注册表拉取映像:
az acr import \
--name myregistry \
--source docker.io/sourcerepo/sourceimage:tag \
--image sourceimage:tag \
--username <username> \
--password <password>
后续步骤
在本文中,你了解了如何从公共注册表或其他专用注册表将容器映像导入 Azure 容器注册表。
- 关于其他映像导入选项,请参阅 az acr import 命令参考。
映像导入可帮助你将内容移动到其他 Azure 区域、订阅或 Microsoft Entra 租户中的容器注册表。 有关更多信息,请参阅手动将容器注册表移动到另一个区域。
从网络受限的容器注册表禁用工件导出。