运行Bash脚本连接Azure Container Registry报未授权认证错误
问题原因
认证失败的核心是Docker命令执行身份不统一:
- 脚本中
docker login myregistry.azurecr.io以当前普通用户身份运行,登录生成的ACR凭证会保存在普通用户家目录的~/.docker/config.json文件中 - 后续拉取镜像用了
sudo docker pull,此时是以root用户身份调用Docker,会读取root家目录下的Docker配置,完全读不到普通用户刚生成的登录凭证,自然返回未授权。
报错里提到的aad access token with sp failed client id must be guid,是root用户本地残留的无效服务主体认证缓存被读取触发的,不是你的登录操作没执行成功。
修复方法
二选一即可:
方法一:统一所有Docker命令的执行权限
不要混用普通用户和sudo执行Docker命令,要么全加sudo,要么把当前用户加入docker用户组后全程不用sudo。
全sudo版本的修正脚本如下:
#!/bin/sh sudo service docker start sudo docker logout az logout sudo docker login myregistry.azurecr.io sudo docker pull myregistry.azurecr.io/rstudio-server:0.1
如果不想每次执行Docker都加sudo,执行以下命令把当前用户加入docker组,重新登录shell后即可生效,后续所有docker命令都不需要加sudo:
sudo usermod -aG docker $USER
方法二:显式指定Docker配置文件路径
如果确实需要混用执行身份,可以在sudo执行pull命令时,显式指定读取普通用户的Docker配置文件:
sudo docker --config /home/你的普通用户名/.docker pull myregistry.azurecr.io/rstudio-server:0.1
注意事项
- 脚本里不要随便加
az logout,如果你之前是通过Azure CLI做ACR认证,主动登出Azure CLI会直接清除关联的ACR访问令牌,导致认证失效 - 如果是用服务主体账号做docker login,确认输入的服务主体Client ID是标准GUID格式,前后不要带多余空格、特殊字符
内容的提问来源于stack exchange,提问作者user1828605
相关产品推荐
相关产品推荐

