Azure容器注册表`docker login`无法工作

11
尝试使用Active Directory凭据使用docker login命令登录Azure容器注册表时,我遇到了问题:

Error response from daemon: Get https://myregistry.azurecr.io/v2/: unauthorized: authentication required

显然,权限存在问题,但我无法找到正确的方法来达成目标。

请注意:

az acr login --name myregistry能够完美工作,之后我能够上传我的镜像,但由于特殊情况,我需要一个使用AD凭据进行身份验证的docker login命令的解决方案。

我尝试使用以下文档为用户提供所需的acrpull/acrpush/acrdelete权限:

https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal

但是没有成功,输出相同。

是否有任何方法可以使用docker login和AD凭据登录ACR?
2个回答

19

您正在跟随的文档是创建容器注册表进行身份验证所需的服务主体的正确方法。您需要为服务主体分配正确的角色。 角色在脚本中描述:

# Default permissions are for docker pull access. Modify the '--role'
# argument value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles

服务主体准备好后,您可以使用以下脚本中的变量命令docker login登录:

docker login $ACR_NAME.azurecr.io -u $SP_APP_ID -p $SP_PASSWD

然后它的工作原理如下:

enter image description here


谢谢您详细的回答,查尔斯。这正是我在第一次尝试中所做的。请问您能澄清一个细节吗?您如何在脚本中指定 SP_APP_ID?是否有用户对象 ID? - DariyN
1
在您提供的文档中,它说您可以创建新的SP或使用现有的SP。无论哪种方式,您还可以使用命令 az ad sp show --id http://yourSPName --query appId -o tsv 来获取SP APP ID。这是应用程序ID。 - Charles Xu
@DariyN 很高兴能帮到你。 - Charles Xu
我在代理后面,但仍然收到“未经授权:需要身份验证”的消息。我已添加代理信息。可以访问hub.docker.com,但无法访问Azure存储库。 - CBBSpike
@CBBSpike,请提出更详细的新问题,以便更多社区可以帮助您。 - Charles Xu
为了消除第一个警告信息,您可以像这样调整命令:echo $SP_PASSWD | docker login $ACR_NAME.azurecr.io -u $SP_APP_ID --password-stdin - mika.koshonson

3

问题找到了!!! 在我的情况下,即使使用代理,端口443也被我内部网络关闭了。我请求了网络团队打开443端口,然后一切都正常工作了。


安全团队到底在哪里打开了端口?我在使用https时遇到了相同的超时错误:Error response from daemon: Get https://xxxxxxxx.azurecr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) - Uday Kiran
我认为他们打开了代理。也许是代理阻止了它?因为被阻止的是出站流量。 - CBBSpike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接