Yaml Azure DevOps: отправка изображения docker в разные ACR

#docker #azure-devops

Вопрос:

Мне нужно создать образ docker в конвейере Azure и перенести его в разные ACR. Я могу успешно переместить изображение в тот же ACR, где оно было загружено, но при переходе в другой ACR задача push завершается ошибкой «Изображение не существует локально с тегом».

 - task: Docker@2
  displayName: Build
  inputs:
    command: build
    containerRegistry: REGISTRY1
    repository: $(ACR_URL1)/test
    tags: |
      latest

# This push succeeds
- task: Docker@2
  displayName: Push to ACR1
  inputs:
    command: push
    containerRegistry: REGISTRY1
    repository: $(ACR_URL1)/test
    tags: |
      latest

# This push fails
- task: Docker@2
  displayName: Push to ACR2
  inputs:
    command: push
    containerRegistry: REGISTRY2
    repository: $(ACR_URL2)/test
    tags: |
      latest
 

Очевидный обходной путь состоит в том, чтобы отдельно создать изображение на каждом ACR, но это далеко не оптимально, так как сборка занимает почти час. И, к сожалению, я не могу использовать docker командную строку, только задачи DevOps (например Docker@2 ).

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

1. Как насчет импорта изображения из одного ACR в другой с помощью задачи azure cli ? Звучит ли это хорошо?

2. Хороший совет, я попытался использовать эту опцию, но потерпел неудачу, потому что мы не можем создать подключение к службе подписки Azure с необходимыми разрешениями. С моего локального компьютера, использующего интерактивную аутентификацию, это работает. Так что для некоторых людей это действительно может быть вариантом.

Ответ №1:

Вы должны правильно пометить контейнер.

Допустим, у вас есть два ACR: foo.azurecr.io и bar.azurecr.io

Ваш первый шаг создает контейнер и помечает его как foo.azurecr.io/test:latest . Вы можете нажать на это foo.azurecr.io , потому что оно помечено соответствующим образом.

Второй толчок завершается неудачно, потому что контейнер не помечен как bar.azurecr.io/test:latest . Вам нужно пометить его. Учитывая ваше ограничение, что вы не можете просто запускать docker tag из командной строки, у вас может быть вторая build задача. Это займет всего несколько секунд, потому что контейнер уже построен.

т.е.

 - task: Docker@2
  displayName: Build
  inputs:
    command: build
    containerRegistry: REGISTRY1
    repository: $(ACR_URL1)/test
    tags: |
      latest

- task: Docker@2
  displayName: Build
  inputs:
    command: build
    containerRegistry: REGISTRY2
    repository: $(ACR_URL2)/test
    tags: |
      latest
 

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

1. Не могли бы вы привести пример YAML? Для tag свойства я указываю значение «последнее». ‘bar.azurecr.io/test» это не тег, это часть имени/пути репозитория, в котором я создаю изображение.

Ответ №2:

Решение оказалось очень простым (но далеко не очевидным). Войдите во все учетные записи, в которые вы хотите отправить свое изображение, и не указывайте containerRegistry свойство в push задаче — оно отправит изображение во все учетные записи, в которые вы вошли. Пример:

 - task: Docker@2
  inputs:
    command: login
    containerRegistry: DEV-ACR

- task: Docker@2
  inputs:
    command: login
    containerRegistry: TST-ACR

- task: Docker@2
  displayName: Push to both DEV-ACR and TST-ACR. Note: containerRegistry property is missing!
  inputs:
    command: buildAndPush
    repository: test