将容器推送到Azure容器注册表时拒绝资源访问

时间:2019-03-29 16:21:06

标签: docker docker-compose azure-devops devops azure-container-registry

使用Docker Compose将容器推入私有Azure容器注册表时,Azure DevOps管道返回以下错误:

  

按下[容器]([注册表] / [应用]:最新)...

     

此推送指向存储库[docker.io/[registry] / [container]]

     

拒绝:请求的对资源的访问被拒绝

azure-pipeline.yml文件摘自Microsoft Microservices eShopOnContainer示例here中显示的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 role中。

1 个答案:

答案 0 :(得分:0)

解决方案是使用容器名称明确显示。 documentation具有误导性,因为它首先指出: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集线器),因为它实际上必须是默认值,这说明了拒绝访问错误。