You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure ML API v2中使用自定义容器注册表的认证问题

问题

我有一个可用的Azure容器注册表(ACR),可以通过服务主体认证执行拉取、推送等操作。但把任务提交到计算集群时,集群无法从该注册表拉取正确的Docker镜像,运行日志显示拉取镜像时提示未授权。我用Azure ML API v2的command函数提交任务,没找到在该函数里添加服务主体的Docker用户名和密码的方式,而v1 API支持这个配置,想问是v2 API有问题还是我漏了操作?

集群运行日志

2023/09/25 14:39:53 Downloading source code...
2023/09/25 14:39:54 Finished downloading source code
2023/09/25 14:39:54 Creating Docker network: acb_default_network, driver: 'bridge'
2023/09/25 14:39:55 Successfully set up Docker network: acb_default_network
2023/09/25 14:39:55 Setting up Docker configuration...
2023/09/25 14:39:55 Successfully set up Docker configuration
2023/09/25 14:39:55 Logging in to registry: caf220d1b3fa459e8a75611cec79dbe5.azurecr.io
2023/09/25 14:39:56 Successfully logged into caf220d1b3fa459e8a75611cec79dbe5.azurecr.io
2023/09/25 14:39:56 Volume source scriptsFromEms successfully created
2023/09/25 14:39:56 Executing step ID: acb_step_0. Timeout(sec): 5400, Working directory: '', Network: 'acb_default_network'
2023/09/25 14:39:56 Scanning for dependencies...
2023/09/25 14:39:57 Successfully scanned dependencies
2023/09/25 14:39:57 Launching container with name: acb_step_0
Sending build context to Docker daemon  77.31kB

Step 1/21 : FROM tampere.azurecr.io/custom/ubuntu20.04@sha256:aa19088a50e382bbde8b89e9a5848ef3632736a35dd45d991cae9afa76ed5cba
Get "https://tampere.azurecr.io/v2/custom/ubuntu20.04/manifests/sha256:aa19088a50e382bbde8b89e9a5848ef3632736a35dd45d991cae9afa76ed5cba": unauthorized: authentication required, visit https://aka.ms/acr/authorization for more information.
2023/09/25 14:39:58 Container failed during run: acb_step_0. No retries remaining.
failed to run step ID: acb_step_0: exit status 1

Run ID: cbt failed after 15s. Error: failed during run, err: exit status 1

使用的Azure ML API v2代码

from azure.ai.ml import command
...
job = command(
    code="./",
    command=cli_command,
    environment=f"mlflow-env:4",  # *must* provide a version
    compute=cluster_name,
    experiment_name=experiment_name,
    display_name=job_name,
    environment_variables={
        "PYTHONUNBUFFERED":"1"
    }
)
print("LAUNCHING JOB")
ml_client.create_or_update(job)
print("JOB LAUNCHED! - HAVE A NICE DAY")
解决方案

Azure ML API v2并没有取消私有ACR的认证配置,只是配置方式和v1不同,可通过以下两种方式解决:

方式一:在环境定义中配置ACR凭据

如果自定义环境存储在私有ACR中,需要在创建环境时指定注册表的认证信息,通过Environment类的credentials参数传入服务主体的客户端ID(用户名)和客户端密钥(密码):

from azure.ai.ml import Environment

env = Environment(
    image="tampere.azurecr.io/custom/ubuntu20.04@sha256:aa19088a50e382bbde8b89e9a5848ef3632736a35dd45d991cae9afa76ed5cba",
    credentials={
        "username": "<服务主体客户端ID>",
        "password": "<服务主体客户端密钥>"
    },
    name="custom-ubuntu-env",
    version="1"
)
# 先创建环境
ml_client.environments.create_or_update(env)

# 提交任务时使用这个环境
job = command(
    code="./",
    command=cli_command,
    environment="custom-ubuntu-env:1",
    compute=cluster_name,
    experiment_name=experiment_name,
    display_name=job_name,
    environment_variables={
        "PYTHONUNBUFFERED":"1"
    }
)
ml_client.create_or_update(job)

方式二:给计算集群的托管标识分配ACR拉取权限

无需在代码中硬编码凭据,更安全的方式是给计算集群使用的托管标识分配ACR的AcrPull角色:

  • 找到Azure ML计算集群,查看其使用的托管标识(系统分配或用户分配)
  • 进入目标ACR的「访问控制(IAM)」页面,添加角色分配
  • 选择AcrPull角色,将计算集群的托管标识添加为角色分配对象
  • 保存配置后,集群即可自动认证拉取ACR中的镜像

注意:日志显示已登录caf220d1b3fa459e8a75611cec79dbe5.azurecr.io,但拉取的是tampere.azurecr.io中的镜像,二者是不同ACR,需确保认证配置针对后者。

内容的提问来源于stack exchange,提问作者SiloSampsa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:37:50