Azure DevOps流水线推送Docker镜像至ACR权限失败求助
解决Azure DevOps自托管代理推送Docker镜像至ACR时的权限失败问题
问题概述
创建了「Docker - 构建并推送镜像至Azure容器注册表(ACR)」流水线,已配置Azure订阅与ACR服务连接,修改azure-pipelines.yml使用自托管代理池并禁用触发器,但运行时Build and push an image to container registry任务推送阶段报错:
denied: retrieving permissions failed ##[error]The process 'C:\Program Files\Docker\Docker\resources\bin\docker.exe' failed with exit code 1
已尝试以管理员身份运行Docker Desktop和代理启动脚本run.cmd,问题未解决,Worker日志显示存在进程环境变量读取权限警告。
解决方案步骤
1. 验证ACR服务连接有效性
- 进入Azure DevOps项目「设置」→「服务连接」,找到对应的Docker注册表服务连接,点击「验证连接」确认状态正常。
- 若验证失败,重新创建服务连接:选择对应Azure订阅,指定目标ACR,确保关联的服务主体被分配ACR的AcrPush角色(最低权限要求)。
2. 确认自托管代理运行用户权限
- 若代理以Windows服务运行,检查服务登录账户是否为本地管理员,且加入了
docker-users本地组:- 打开「计算机管理」→「本地用户和组」→「组」→
docker-users; - 将代理运行用户添加至该组,重启Docker Desktop和代理服务。
- 打开「计算机管理」→「本地用户和组」→「组」→
- 若为临时运行的代理,确认当前启动
run.cmd的用户在docker-users组内,且拥有流水线代码目录的读写权限。
3. 手动测试Docker与ACR的交互
在代理机器上执行以下操作,排除流水线配置外的问题:
- 登录ACR:
可使用服务连接对应的服务主体凭据(客户端ID+密钥),或ACR管理员账户(需先启用)。docker login <你的ACR地址>.azurecr.io - 构建并推送测试镜像:
若手动推送失败,优先排查ACR权限配置(如服务主体角色、管理员账户状态)。docker build -t <你的ACR地址>.azurecr.io/test:v1 . docker push <你的ACR地址>.azurecr.io/test:v1
4. 检查Docker Desktop配置
- 打开Docker Desktop「设置」→「资源」→「文件共享」,确认流水线代码所在本地目录已被添加到共享列表,且权限正常。
- 若使用WSL2后端,确认「Use the WSL 2 based engine」已启用,且WSL2分发版正常运行。
5. 重置自托管代理环境
- 停止代理(服务运行则停止服务,临时运行则关闭命令窗口);
- 删除代理目录下的
_work文件夹; - 重新启动代理,再次运行流水线。此操作可清除缓存的无效凭据或配置。
6. 清理Docker凭据缓存
- 执行命令登出ACR:
docker logout <你的ACR地址>.azurecr.io - 备份并删除
%USERPROFILE%\.docker\config.json文件,重新登录ACR后再运行流水线。
内容的提问来源于stack exchange,提问作者Péter Szilvási
相关产品推荐
相关产品推荐

