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

Azure DevOps如何实现Build构建Docker镜像、Release阶段推送?

实现Azure DevOps Build仅构建镜像、Release推送镜像的方案

问题背景

我们在Azure DevOps中使用Build和Release流水线,原本通过buildAndPush命令在Build阶段完成镜像构建与推送,但希望改为Build仅构建镜像,Release阶段再推送,尝试两种方式均失败:

  1. 在Release中使用buildAndPush重新构建,出现权限错误(无法写入obj目录文件)
  2. 在Release中直接执行push命令,提示本地不存在对应镜像

可行解决方案

核心思路:Build阶段构建镜像后,将镜像导出为tar包并作为流水线工件发布;Release阶段下载该tar包,加载到本地Docker后再推送至ACR。

1. Build流水线配置(仅构建+导出镜像)

修改Build的YAML,使用build命令仅构建镜像,然后导出为tar包并发布为工件:

# 构建Docker镜像,仅本地保留,不推送
- task: Docker@2
  inputs:
    containerRegistry: 'MyContainerRegistry'
    repository: 'classificationapi'
    command: 'build'
    Dockerfile: 'src\Services\Classification\ClassificationService.Api\Dockerfile'
    buildContext: ''
    tags: |
      $(Build.BuildId)  # 用Build ID作为镜像标签,保证唯一性

# 将构建好的镜像导出为tar包
- task: CmdLine@2
  inputs:
    script: |
      docker save -o classificationapi-$(Build.BuildId).tar MyContainerRegistry/classificationapi:$(Build.BuildId)

# 将tar包发布为流水线工件
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: 'classificationapi-$(Build.BuildId).tar'
    ArtifactName: 'docker-image'
    publishLocation: 'Container'

2. Release流水线配置(加载镜像+推送)

在Release中下载工件里的tar包,加载到本地Docker后推送至ACR:

# 下载Build阶段发布的docker-image工件
- task: DownloadBuildArtifacts@0
  inputs:
    buildType: 'current'
    downloadType: 'single'
    artifactName: 'docker-image'
    downloadPath: '$(System.DefaultWorkingDirectory)'

# 将tar包加载到本地Docker
- task: CmdLine@2
  inputs:
    script: |
      docker load -i $(System.DefaultWorkingDirectory)/docker-image/classificationapi-$(Build.BuildId).tar

# 登录到Azure Container Registry
- task: Docker@2
  inputs:
    containerRegistry: 'MyContainerRegistry'
    command: 'login'

# 推送镜像到ACR
- task: Docker@2
  inputs:
    containerRegistry: 'MyContainerRegistry'
    repository: 'classificationapi'
    command: 'push'
    tags: |
      $(Build.BuildId)

错误原因说明

  1. Release中buildAndPush权限错误:默认情况下,Azure DevOps Release代理的工作目录是只读的,而Docker构建过程中需要写入项目的obj、bin等目录,因此触发权限拒绝错误。
  2. 直接push找不到镜像:Build阶段构建的镜像仅存在于Build代理的本地Docker环境中,Release代理是独立的环境,无法直接访问Build代理的本地镜像,必须通过工件传递镜像文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:55:19