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

Azure Pipelines推送Docker镜像至ACR遇防火墙访问拒绝问题

解决Azure DevOps托管代理推送ACR时的防火墙拦截问题

首先明确核心问题:你勾选的「允许受信任的Microsoft服务访问」并不包含Azure DevOps托管代理——这个选项仅针对Azure App Service、Azure Functions等直接与ACR集成的PaaS服务,托管代理是从公共IP池发起请求,属于普通外部客户端,不在信任列表内。

以下是可行的解决方案:

方案1:用ACR Tasks替代Docker@2任务(零额外成本)

直接使用ACR自身的构建任务来构建并推送镜像,ACR Tasks运行在Azure内部环境,默认不受ACR防火墙限制,完全不需要处理IP问题:

  • 在Azure DevOps pipeline中替换Docker@2任务为Azure CLI任务,执行az acr build命令:
    az acr build --registry your-acr-name --image your-image:tag ./path-to-dockerfile
    
  • 该命令会自动拉取代码、构建镜像并推送到目标ACR,无需额外配置网络规则,成本为零,且兼容现有Dockerfile。

方案2:使用VNet集成的Azure DevOps托管代理池

如果必须保留Docker@2任务的工作流,可以创建虚拟网络集成的托管代理池:

  • 在Azure DevOps中创建基于Azure VMSS的自托管代理池,并将VMSS部署到与ACR同VNet(或对等连接的VNet)中。
  • 在ACR的网络设置中,添加允许该VNet的访问规则。
  • 代理会使用VNet内部IP访问ACR,无需关注公共IP变更,Azure DevOps会自动管理VMSS的缩放和维护,成本远低于手动维护虚拟机。

方案3:动态添加代理IP到ACR网络规则(修正之前的思路)

如果不想改动现有任务,可通过以下步骤动态临时添加代理IP:

  1. 在Pipeline第一步获取当前托管代理的公网IP:
    $agentIp = (Invoke-WebRequest -Uri "https://api.ipify.org").Content.Trim()
    
  2. 使用具备ACR网络配置权限的服务连接执行Azure CLI,添加IP规则:
    az acr network-rule add --registry your-acr-name --ip-address $agentIp
    
  3. 执行原有的Docker@2构建推送任务。
  4. 任务完成后删除临时IP规则:
    az acr network-rule remove --registry your-acr-name --ip-address $agentIp
    

关键:Azure CLI命令必须通过Azure DevOps的服务连接(服务主体身份)执行,而非托管代理的默认身份——ARM管理API不受ACR防火墙限制,只要服务主体有ACR的网络配置权限,就能成功添加/删除规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:10:11