登录到容器注册表时出现以下错误
命令:
docker login <MY_REGISTRY_NAME>.azurecr.io
错误消息:
Error response from daemon: Get https://<MY_REGISTRY_NAME>.azurecr.io/v2/: unauthorized: Application not registered with AAD
转到Container Registry中的Access Keys并启用管理员用户,然后使用自动生成的凭据通过Docker 登录
TL;DR
检查身份验证选项和登录疑难解答文档的详细信息。下面提到的解决方案适用于Docker和Helm的Azure AD个人登录。
尽管@Anudeepa接受的回答解决了问题,但这不是管理员帐户的预期用途(请参阅文档):
管理员帐户是为单个用户访问注册表而设计的,主要用于测试目的。我们不建议在多个用户之间共享管理员帐户凭据。所有使用管理帐户进行身份验证的用户都显示为具有对注册表的推送和拉取访问权限的单个用户。更改或禁用此帐户将禁用所有使用其凭据的用户的注册表访问。对于无头场景,建议用户和服务主体使用个人标识。
因此,解决该问题的第一个地址应该是解决登录问题的文档。上述错误消息Error response from daemon: Get https://<MY_REGISTRY_NAME>.azurecr.io/v2/: unauthorized: Application not registered with AAD
可能具有多种原因。
请记住,向ACR进行身份验证有多种选择。
我认为这个问题要么指1)使用Azure AD的个人登录,要么指2)服务主体。
我的问题是个人登录,因为有一个问题您的用户名必须是00000000-0000-0000-0000-000000000000
(这不是您自己id的占位符)。以下为我修复了错误:
USER_NAME="00000000-0000-0000-0000-000000000000"
PASSWORD=$(az acr login --name <MY_REGISTRY_NAME>
--expose-token
--output tsv
--query accessToken)
echo "$PASSWORD" | docker login <MY_REGISTRY_NAME>.azurecr.io
--username "$USER_NAME"
--password-stdin
echo "$PASSWORD" | helm registry login tacto.azurecr.io
--username "$USER_NAME"
--password-stdin
对我来说,让一切顺利进行的最简单方法是在https://docs.docker.com/cloud/aci-integration/.实际上,你所要做的就是在Azure中创建容器,打开PowerShell(如果你还没有,请安装/导入Azure模块),然后运行命令"docker登录azure"这将弹出一个浏览器窗口,您可以从那里直接登录到您的容器中。我还没有尝试过使用多个容器,因为到目前为止我只需要一个,但我无法想象这会有多困难。
对于那些不想通过"访问密钥";部分,您可以点击此链接-https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal-创建服务主体。运行上面提到的链接中提供的脚本会生成一个ID-密码组合,该组合可用于docker登录命令(在docker登录指令中将ID作为用户名)。这也确保了如果您想通过您编写的一些脚本运行docker命令,那么您可以使用这些凭据。
该命令提供了为正在创建的服务主体分配固定角色的功能。可以指定特定于拉动或推动(包括拉动)的角色。
我不清楚的是,为什么通过Azure AD添加的用户不能在docker登录命令中使用,但使用服务主体是有效的。(如果有人对此有想法,请随时分享)。
如果您使用完整的注册表名称,例如registryname.azurecr.io
作为用户名,而不仅仅是registryname
,则可能会发生这种情况
错误消息错误得令人恼火!
正如其他人所提到的,如果您愿意,可以使用管理员用户。
然而,对于较大的组织来说,这可能不是理想的解决方案。相反,您可以使用RBAC和Azure AD登录来管理访问。以下是我采取的步骤:
- 确保您和您的用户具有所需的RBAC角色。有关详细信息,请参阅以下链接:https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli
- 如果您还没有这样做,请下载Azure CLI:https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-windows?tabs=azure-cli
- 使用以下命令登录Azure CLI:
az login
应显示一个弹出窗口,允许您通过浏览器登录 - 确保您已登录到与Azure容器存储库相同的订阅
- 最后,使用
az acr login --name <your-repo-name-here>.azurecr.io
登录到您的azure容器存储库
就是这样!我发现这个解决方案可以让协作变得更容易。希望它能有所帮助!
在docker login
期间,我使用服务主体的DisplayName
而不是ApplicationId
作为--username
的值时,出现了此错误unauthorized: Application not registered with AAD
。
Get-AzADServicePrincipal -DisplayName <DisplayName> | Select ApplicationId
通过这种方式,您可以在Azure Powershell中通过DisplayName
找到服务主体的ApplicationId
。你也可以在Azure门户网站上找到它。
- 使用
az acr credential show --name testcontainerregistry
获取凭据 - 在
docker login testcontainerregistry.azurecr.io
中使用这些凭据