#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