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

Azure DevOps流水线访问受限网络ACR失败,寻求解决方案

解决ADO流水线访问受限ACR的问题

核心原因分析

你的问题确实和ACR的网络限制直接相关:本地运行能成功是因为你的本地IP在ACR的允许网络列表里,但ADO流水线的代理IP不在其中。虽然开启了「允许受信任服务」,但Azure DevOps的托管代理并不在ACR默认的受信任服务列表里,所以还是会被拦截。另外你当前az acr login命令里带了.azurecr.io后缀,这也可能导致资源查找失败(对应错误日志里的「资源找不到」提示)。

可行解决方案

方案1:将ADO代理IP加入ACR允许列表

  • 如果使用Microsoft托管代理:
    1. 下载Azure每周更新的数据中心IP列表,提取流水线所在区域的IP段
    2. 将这些IP段添加到ACR的「网络规则」->「允许的IP地址范围」中
  • 如果使用自托管代理:
    直接将代理服务器的公网IP添加到ACR允许列表即可

方案2:使用Azure托管身份替代服务主体

托管身份更安全,且能适配Azure内部的权限体系,步骤如下:

  1. 为ADO流水线启用系统分配托管身份:
    进入ADO项目设置 -> 流水线 -> 服务连接 -> 新建服务连接 -> Azure Resource Manager -> 托管身份,选择对应订阅和资源组完成创建
  2. 给托管身份分配ACR权限:
    进入ACR的「访问控制(IAM)」-> 添加角色分配 -> 选择AcrPush和AcrPull角色,将ADO流水线的系统托管身份设为成员
  3. 修改流水线任务:
    - task: AzureCLI@2
      displayName: 'ACR Login via Managed Identity'
      inputs:
        azureSubscription: '你的托管身份服务连接名称'
        scriptType: 'bash'
        inlineScript: |
          az acr login -n myACR
    
    注意:这里只需要ACR的名称,不需要带.azurecr.io后缀

方案3:直接用SP凭据登录Docker

如果上述方案暂时无法实施,可以绕开Azure CLI的AAD token流程,直接用SP凭据登录Docker:

- task: Bash@3
  displayName: 'Docker Login to ACR'
  inputs:
    targetType: 'inline'
    script: |
      docker login myACR.azurecr.io -u $(sp_app_id) -p $(sp_password)

额外检查项

  • 确认ACR的「允许受信任的Azure服务访问此容器注册表」选项已勾选
  • 验证SP的权限是否确实覆盖了两个ACR的推送/拉取操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:33:10