Azure DevOps CI/CD Pipeline推送镜像至ACR时Docker进程退出码1失败问题排查
Azure DevOps CI/CD Pipeline推送镜像至ACR时Docker进程退出码1失败问题排查
看起来你的Pipeline已经成功推送了部分镜像到ACR,但整体失败抛出了Docker进程退出码1的错误,我来帮你一步步梳理可能的问题点和解决办法:
一、先获取更详细的错误日志(最关键第一步)
退出码1只是一个通用错误,没有具体指向性,你需要先拿到失败步骤的完整日志:
- 找到Pipeline里失败的那个任务(可能是Docker登录、Build或Push步骤),点击任务展开详细日志,定位Docker命令抛出的具体错误信息(比如权限不足、镜像名称格式错误、Compose文件语法问题等),这是精准定位问题的核心。
二、排查重复登录的冲突问题
你在Pipeline里手动加了一个Docker login to ACR的脚本步骤,但后面的DockerCompose@0任务本身会通过你配置的Azure订阅服务连接自动完成ACR登录,重复登录可能导致认证冲突:
- 建议先移除这个手动登录的脚本步骤,让DockerCompose任务自动处理登录逻辑,避免不必要的认证干扰。
三、检查Docker Compose变量与文件的兼容性
你设置了dockerComposeFileArgs: 'REGISTRY=crschacfsnonprod.azurecr.io/',需要确认你的docker-compose.yml文件是否正确引用了这个变量:
- 比如镜像定义应该是类似这样的格式:
image: ${REGISTRY}aquarium:${TAG},如果变量引用格式错误(比如用了$REGISTRY而非${REGISTRY},或者Windows环境下变量语法不匹配),会导致镜像名称非法,进而构建/推送失败。 - 另外要注意
REGISTRY变量末尾的斜杠,确保拼接后的镜像名称是合法的(比如crschacfsnonprod.azurecr.io/aquarium:latest,斜杠不能多也不能少)。
四、验证ACR权限配置
虽然你启用了ACR的管理员用户,并用变量存储了密码,但还是要确认权限是否到位:
- 检查
$(acrUsername)和$(acrPassword2)变量是否正确设置(注意变量名是acrPassword2,别拼写错误),并且该用户拥有ACR的推送(Push)权限。 - 另外,你在DockerCompose任务里用的是Azure订阅连接
HAWeb2-CFS-NonProd,要确认这个连接对应的服务主体(或托管身份)是否被添加到ACR的AcrPush角色中,避免因权限不足导致推送失败。
五、检查Windows代理的Docker环境兼容性
你用的是windows-2019虚拟机代理,需要确认Docker和Docker Compose的版本是否支持你的docker-compose.yml语法:
- Windows环境下的Docker Compose对部分Linux专属的Compose语法支持有限,比如特殊网络模式、卷挂载格式,建议你在本地Windows环境测试执行
docker-compose build和docker-compose push命令,看是否能正常运行,排除环境差异问题。
六、排查镜像标签的冲突问题
你设置了additionalImageTags: '$(Build.BuildNumber)-$(Build.SourceBranchName)'和includeLatestTag: true,要确认:
- 镜像标签是否符合ACR的命名规则(不能包含空格、特殊字符,大小写也要注意),
$(Build.SourceBranchName)是Initial-K8-Setup,这个名称是合法的,但要确保拼接后的标签没有格式问题。 - 如果之前已经推送过相同标签的镜像,虽然ACR允许覆盖,但如果存在并发推送或镜像锁定的情况,也可能导致失败,可以尝试临时修改标签格式测试。
备注:内容来源于stack exchange,提问作者DemantCHRX
相关产品推荐
相关产品推荐

