Azure DevOps如何实现Build构建Docker镜像、Release阶段推送?
实现Azure DevOps Build仅构建镜像、Release推送镜像的方案
问题背景
我们在Azure DevOps中使用Build和Release流水线,原本通过buildAndPush命令在Build阶段完成镜像构建与推送,但希望改为Build仅构建镜像,Release阶段再推送,尝试两种方式均失败:
- 在Release中使用
buildAndPush重新构建,出现权限错误(无法写入obj目录文件) - 在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)
错误原因说明
- Release中buildAndPush权限错误:默认情况下,Azure DevOps Release代理的工作目录是只读的,而Docker构建过程中需要写入项目的
obj、bin等目录,因此触发权限拒绝错误。 - 直接push找不到镜像:Build阶段构建的镜像仅存在于Build代理的本地Docker环境中,Release代理是独立的环境,无法直接访问Build代理的本地镜像,必须通过工件传递镜像文件。
内容的提问来源于stack exchange,提问作者Ogglas
相关产品推荐
相关产品推荐

