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



使用 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 角色。

解决方案是明确使用容器名称。该文档具有误导性,因为它首先指出:默认情况下,containerregistrytypeAzure 容器注册表。该示例继续将 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>'

最新更新