使用 Docker Compose 将容器推送到私有 Azure 容器注册表时,Azure DevOps 管道返回以下错误:
正在推送 [容器]([注册表]/[应用程序]:最新)...
推送引用存储库 [docker.io/[registry]/[container]]
被拒绝:请求的资源访问被拒绝
The azure-pipeline.yml
文件取自 Microsoft 微服务 eShopOnContainer 示例中显示的 Docker Compose 示例,here https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/build/azure-devops/basket-api/azure-pipelines.yml:
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 角色 https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles.
解决方案是明确容器名称。这文档 https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/build/docker-compose?view=azure-devops#container-registry-types具有误导性,因为它首先指出:containerregistrytype
is Azure 容器注册表默认情况下。这个例子继续给出Contoso作为价值azureContainerRegistry
.
这是错误的。您需要将其显式设置为 Azure 中的“登录服务器”值。因此注册表应为“contoso.azurecr.io”。所以完整的例子should be:
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),因为它实际上必须是默认值,这解释了访问被拒绝错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)