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

Azure DevOps能否动态创建容器注册表服务连接?无连接如何推送镜像?

解决Azure DevOps流水线中动态创建ACR后推送镜像的问题

因为你是在流水线中动态创建ACR,无法预先配置对应服务连接,所以不能直接使用依赖服务连接的Docker@2任务,下面是几种可行的解决方案:

方法1:使用Azure CLI + 原生Docker命令完成构建推送

这种方式无需依赖预配置的服务连接,直接通过Azure CLI获取ACR权限并执行Docker操作:

  1. 确保流水线已完成ACR创建(可通过AzureCLI@2任务完成创建步骤)
  2. 添加以下任务完成登录、构建、推送:
- task: AzureCLI@2
  displayName: 'Login to ACR and push image'
  inputs:
    azureSubscription: '<你的Azure订阅服务连接>'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # 获取ACR登录服务器地址
      ACR_LOGIN_SERVER=$(az acr show --name <你的ACR名称> --query loginServer --output tsv)
      
      # 登录目标ACR
      az acr login --name <你的ACR名称>
      
      # 构建镜像并标记
      docker build -t $ACR_LOGIN_SERVER/webappdocker:prod WebAppDocker/
      
      # 推送镜像至ACR
      docker push $ACR_LOGIN_SERVER/webappdocker:prod

注:这里需要预先配置访问Azure订阅的服务连接(用于执行az acr系列命令),该连接针对Azure订阅而非单个ACR,可提前配置完成。

方法2:动态创建ACR服务连接(通过Azure DevOps REST API)

如果一定要使用Docker@2任务,可以在流水线中动态创建ACR对应的服务连接,步骤如下:

  1. 准备一个拥有Azure DevOps组织级服务连接管理权限的PAT
  2. 添加任务获取ACR凭据并调用API创建服务连接:
- task: AzureCLI@2
  displayName: 'Get ACR credentials'
  name: getACRInfo
  inputs:
    azureSubscription: '<你的Azure订阅服务连接>'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # 获取ACR用户名、密码和登录服务器
      ACR_USERNAME=$(az acr credential show --name <你的ACR名称> --query username --output tsv)
      ACR_PASSWORD=$(az acr credential show --name <你的ACR名称> --query passwords[0].value --output tsv)
      ACR_LOGIN_SERVER=$(az acr show --name <你的ACR名称> --query loginServer --output tsv)
      
      # 设置流水线变量供后续任务使用
      echo "##vso[task.setvariable variable=ACR_USERNAME]$ACR_USERNAME"
      echo "##vso[task.setvariable variable=ACR_PASSWORD;issecret=true]$ACR_PASSWORD"
      echo "##vso[task.setvariable variable=ACR_LOGIN_SERVER]$ACR_LOGIN_SERVER"

- task: PowerShell@2
  displayName: 'Create ACR Service Connection'
  inputs:
    targetType: 'inline'
    script: |
      $orgUrl = "https://dev.azure.com/<你的Azure DevOps组织名称>"
      $projectName = "<你的项目名称>"
      $serviceConnName = "<要创建的服务连接名称>"
      $pat = "<你的PAT令牌>"
      
      $headers = @{
        Authorization = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat"))
        "Content-Type" = "application/json"
      }
      
      $body = @{
        name = $serviceConnName
        type = "dockerregistry"
        url = "https://$env:ACR_LOGIN_SERVER"
        authorization = @{
          scheme = "UsernamePassword"
          parameters = @{
            username = $env:ACR_USERNAME
            password = $env:ACR_PASSWORD
          }
        }
        isShared = $false
        owner = "library"
      } | ConvertTo-Json -Depth 10
      
      $apiUrl = "$orgUrl/$projectName/_apis/serviceendpoint/endpoints?api-version=7.1-preview.4"
      Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body
  1. 之后即可使用Docker@2任务,指定刚创建的服务连接名称:
- task: Docker@2
  displayName: Build and push an image to container registry
  inputs:
    containerRegistry: '<刚创建的服务连接名称>'
    repository: 'webappdocker'
    command: 'buildAndPush'
    Dockerfile: 'WebAppDocker/Dockerfile'
    tags: 'prod'

注:此方式需确保PAT权限足够,且服务连接创建后需短暂等待生效。

方法3:使用Docker@2任务的手动登录模式

跳过containerRegistry参数,手动完成ACR登录后执行构建推送:

- task: AzureCLI@2
  displayName: 'Get ACR password'
  name: getACRPass
  inputs:
    azureSubscription: '<你的Azure订阅服务连接>'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      ACR_PASSWORD=$(az acr credential show --name <你的ACR名称> --query passwords[0].value --output tsv)
      echo "##vso[task.setvariable variable=ACR_PASSWORD;issecret=true]$ACR_PASSWORD"

- task: Docker@2
  displayName: 'Login to ACR'
  inputs:
    command: 'login'
    containerRegistry: '<你的ACR登录服务器,例如xxx.azurecr.io>'
    username: '<你的ACR用户名>'
    password: '$(ACR_PASSWORD)'

- task: Docker@2
  displayName: 'Build and push image'
  inputs:
    command: 'buildAndPush'
    repository: '<你的ACR登录服务器>/webappdocker'
    Dockerfile: 'WebAppDocker/Dockerfile'
    tags: 'prod'

这种方式直接使用ACR的用户名密码完成登录,无需预配置服务连接。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:15:03