尝试从azure dev ops推送到azure容器注册表时请求访问被拒绝
当我尝试推送到azure容器注册表时,会一直出现此错误,我已将其作为“containerregistry”连接到“服务连接”中尝试从azure dev ops推送到azure容器注册表时请求访问被拒绝,azure,docker,docker-compose,azure-devops,azure-pipelines,Azure,Docker,Docker Compose,Azure Devops,Azure Pipelines,当我尝试推送到azure容器注册表时,会一直出现此错误,我已将其作为“containerregistry”连接到“服务连接”中 trigger: - master resources: - repo: self variables: tag: '$(Build.BuildId)' azureContainerRegistry: containerregistry azureSubscriptionEndpoint: resourcemanager stages: - stage
trigger:
- master
resources:
- repo: self
variables:
tag: '$(Build.BuildId)'
azureContainerRegistry: containerregistry
azureSubscriptionEndpoint: resourcemanager
stages:
- stage: Build
displayName: Build image
jobs:
- job: Build
displayName: Build
pool:
vmImage: 'ubuntu-latest'
steps:
- task: DockerCompose@0
displayName: Build services
inputs:
action: Build services
azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
azureContainerRegistry: $(azureContainerRegistry)
dockerComposeFile: docker-compose.yml
projectName: $(Build.Repository.Name)
qualifyImageNames: true
additionalImageTags: $(Build.BuildId)
- task: DockerCompose@0
displayName: Push services
inputs:
action: Push services
azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
azureContainerRegistry: $(azureContainerRegistry)
dockerComposeFile: docker-compose.yml
projectName: $(Build.Repository.Name)
qualifyImageNames: true
additionalImageTags: $(Build.BuildId)
includeLatestTag: true
这个构建可以很好地工作,但是当它尝试推送图像时,我得到了以下结果
[命令]/usr/bin/docker push csym023容器/csym023\u api
推送引用存储库[docker.io/csym023container/csym023\u api]
e7a7b94f6564:准备
……等等
2c6ac8e5063e:等待
拒绝:请求的对资源的访问被拒绝
[错误]被拒绝:请求的对资源的访问被拒绝
[错误]进程“/usr/bin/docker”失败,退出代码为1
[部分]整理:推送服务
看起来它试图推送到docker.io是出于某种原因,我确实读到您需要登录URL,我确实尝试了,但后来我得到了一个关于授权的错误,我不知道如何在管道文件中实现
[命令]/usr/bin/docker push csym023.azurecr.io/csym023\u api
推送引用存储库[csym023.azurecr.io/csym023\u api]
f29018588af0:准备
……等等
cc967c529ced:等待
未经授权:需要身份验证
[错误]未经授权:需要身份验证
[错误]进程“/usr/bin/docker”失败,退出代码为1
[部分]整理:推送服务
感谢您提供详细的日志共享 根据YAML脚本和错误日志: 似乎您是通过将容器注册表值指定为变量来配置任务的。这应该是它连接到
docker.io
而不是以后连接到***.azurecr.io
的原因
因为服务器无法知道正确的目标容器,因此会被误导。此外,Azure容器注册表的标识对于docker容器不可用。此时,服务器提示错误:denied:请求的资源访问被拒绝
如果使用我们在YAML中提供的配置面板,则在您选择相应的订阅连接后,Azure容器注册表名称将自动显示: 请参阅azureContainerRegistry的值:
{"loginServer":"merlin1115.azurecr.io", "id" : "/subscriptions/daae*****9d072825/resourceGroups/{resource group}/providers/Microsoft.ContainerRegistry/registries/merlin1115"}
您可以看到,我们提供了确切的目标Azure容器注册表名及其唯一id。此时,服务器不会混淆它应该连接到哪个服务器。同时,它可以生成正确的标记,该标记将在以后的操作中使用(推送等)
您在本文中找到的解决方案,对于
azureContainerRegistry
,@Ste将其值指定为***.azurecr.io
。这与我上面提到的方式类似。不确定应用@Ste的解决方案时为什么会遇到未经授权的错误
@Ste的解决方案没有问题。只是,当您自己指定容器值时,生成的标记具有很多不确定性,当需要在以后的操作中使用时,会被验证为不合理
这就是为什么我建议您在尝试应用我的方式时对该解决方案进行注释。是否可以更新有关授权的详细错误消息?另外,共享脚本示例(撰写、dockerfile)和完整的推送日志会更好吗?任务推送到docker.io而不是azurecr.io是不正常的,我们在文档中没有提到这一点。如果这确实是一个误导,我会让相应的团队知道这一点,并做一些更改。我已经添加了来自dev ops的授权错误日志,如何共享我的脚本示例?我确实包含了我能看到的所有日志,但删除了重复的(“等待”/“准备”),但如果它们对调试很重要,可以添加它们。您可以将其导入第三方,然后在此处共享链接。如果您可以将system.debug设置为true并共享此完整日志,则效果会更好。我认为有必要从中进行分析,以了解帐户、它正在访问的服务器主机以及它是如何编译的。我试图发送一封电子邮件,但它反弹回来了,我会分享,但我仍在学习如何使用docker/azure,因此不确定在何处设置“system.debug=true”。但是可以共享我的docker-compose.yml、azure-pipelines.yml和我的dockerfiles,如果这有助于解决您遇到的第一个错误(),请参阅第56行。在这里,它正试图连接到此
containerregistry
。如果我没有错,这不应该是azure的,对吧?如果是,这就是为什么稍后访问docker.io。如何在YAML中配置任务?请按照我的屏幕截图()重新配置任务并重新运行管道。注意:这里建议您对第一个错误进行故障排除,对于在另一个线程中找到的解决方案,请将其注释为临时。