使用 Docker Compose 将容器推送到专用 Azure 容器注册表时,Azure DevOps 管道返回以下错误:
正在推送 [容器] ([注册表]/[应用程序]:最新(...
推送是指存储库 [docker.io/[注册表]/[容器]]
拒绝:请求访问资源
被拒绝
azure-pipeline.yml
文件取自 Microsoft 微服务 eShopOnContainer 示例中所示的 Docker Compose 示例,如下所示:
variables:
azureContainerRegistry: myregistry
azureSubscriptionEndpoint: My Service Principle
...
task: DockerCompose@0
displayName: Compose push customer API
inputs:
containerregistrytype: Azure Container Registry
azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
azureContainerRegistry: $(azureContainerRegistry)
dockerComposeCommand: 'push [container]'
dockerComposeFile: docker-compose.yml
qualifyImageNames: true
projectName: ""
dockerComposeFileArgs: |
TAG=$(Build.SourceBranchName)
服务原则是 AcrPush 角色。
解决方案是明确使用容器名称。该文档具有误导性,因为它首先指出:默认情况下,containerregistrytype
是 Azure 容器注册表。该示例继续将 Contoso 作为 azureContainerRegistry
的值。
这是错误的。需要将其显式设置为 Azure 中的"登录服务器"值。因此,注册表应为"contoso.azurecr.io"。所以完整的例子应该是:
variables:
azureContainerRegistry: contoso.azurecr.io
azureSubscriptionEndpoint: Contoso
steps:
- task: DockerCompose@0
displayName: Container registry login
inputs:
containerregistrytype: Azure Container Registry
azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
azureContainerRegistry: $(azureContainerRegistry)
这就是为什么它所指的推送存储库实际上是:docker.io(公共 docker hub(,因为这实际上必须是默认的 whch 解释访问被拒绝错误。
我在管道Azure
遇到了类似的问题。我错过了在存储库部分添加docker-id
。
从Azure
,在推送时,如果仅使用名称,例如 <repo-name>
,可能不起作用。它需要完全限定的存储库名称,其中还包括docker-id
。
用
repository: '<docker-id>/<repo-name>'
而不是
repository: '<repo-name>'
管道代码段:
- task: Docker@2
inputs:
containerRegistry: 'service-connection-name'
repository: '<docker-id>/<repo-name>'