Отказано в доступе к ресурсам при отправке контейнера в реестр контейнеров Azure

#docker #docker-compose #azure-devops #devops #azure-container-registry

#docker #docker-создать #azure-devops #devops #azure-container-registry

Вопрос:

При отправке контейнеров в частный реестр контейнеров Azure с помощью Docker Compose конвейер Azure DevOps возвращает следующую ошибку:

Отправка [контейнера] ([реестр] / [приложение]:последняя версия)…

Отправка относится к репозиторию [docker.io /[реестр]/[контейнер]]

отказано: запрошенный доступ к ресурсу отклонен

azure-pipeline.yml Файл взят из примера Docker Compose, показанного в примере Microsoft Microservices eShopOnContainer, здесь:

 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.

Комментарии:

1. Вы пытаетесь установить доверие к содержимому для образов сборки и отправки Docker ?

2. Я использую только стандартный план для ACR в Azure, поэтому по умолчанию он отключен. Отличный крик, думал, что это могло быть оно!

3. Возможно, вы можете попробовать это. Надеюсь, это сработает.

Ответ №1:

Решение должно быть явным с именем контейнера. Документация вводит в заблуждение, поскольку, во-первых, в ней указано, что: по умолчанию это containerregistrytype Azure Container Registry……….. по умолчанию это Azure Container Registry. Далее в примере в качестве значения для указывается 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)
  

Вот почему push-репозиторий, на который он ссылался, на самом деле был: docker.io (общедоступный концентратор docker) поскольку это должно быть фактически по умолчанию, что объясняет ошибку «отказано в доступе».

Комментарии:

1. Чтобы быть явным. Вам нужно не только указать полное имя сервера для входа ( contoso.azurecr.io ), вы должны указать containerregistrytype: Azure Container Registry . По умолчанию используется dockerhub, а не ACR.

Ответ №2:

У меня была аналогичная проблема из 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>'