Доступ к Docker изображениям в многоступенчатой ​​Azure Devops - PullRequest
0 голосов
/ 13 апреля 2020

Я строю Azure конвейер DevOps и пробовал многоэтапную функцию, это определяется с помощью файла yml.

В определении yml у меня есть два этапа, один из которых заключается в создании docker изображений с помощью команды docker -compose, второй этап - перевести эти изображения в ACR. Кажется, что это невозможно, так как мне не удалось получить доступ к недавно созданным изображениям с первого этапа. Вот пример файла yml

stages:
- stage: Build
  displayName: Build image
  jobs:  
  - job: Build
    displayName: Build
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - publish:  $(Build.ArtifactStagingDirectory)
      artifact: docker-images
    - task: DockerCompose@0
      inputs:
        containerregistrytype: 'Azure Container Registry'
        azureSubscription: '************'
        azureContainerRegistry: '************'
        dockerComposeFile: '**/docker-compose.yml'
        action: 'Build services'
        additionalImageTags: '$(Build.BuildId)'
- stage: Push
  displayName: Push image
  jobs:  
  - job: Push
    displayName: Push
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - download: current
      artifact: docker-images
    - task: DockerCompose@0
      inputs:
        containerregistrytype: 'Azure Container Registry'
        azureSubscription: '************'
        azureContainerRegistry: '************'
        dockerComposeFile: '**/docker-compose.yml'
        action: 'Push services'
        additionalImageTags: '$(Build.BuildId)'

Вопрос в том, как получить доступ к docker изображениям, созданным на моем предыдущем этапе? где это хранится? Я пытался загрузить $(Build.ArtifactStagingDirectory) с первого этапа, но, похоже, его не было. То же самое относится, если у меня есть один этап, но отдельные работы. Если бы я использовал и build, и pu sh на одном этапе, он работал бы хорошо, но я хочу иметь отдельные этапы для каждого.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Прежде всего, вы всегда должны ставить задание опубликовать sh артефактов в конце этапа. Или вы просто опубликуете sh пустую папку.

Во-вторых, сборка команды dock compose и сохранение образа в папке docker на хост-компьютере. Ничего не будет выводиться в папку артефактов $(Build.ArtifactStagingDirectory) агента.

В качестве обходного пути для передачи изображения docker между этапами, вы можете использовать команду docker image save, чтобы специально сохранить изображение в папке $(Build.ArtifactStagingDirectory). И используйте задачу publi sh artifacts, чтобы опубликовать sh изображение на azure devops сервере. Затем вы можете использовать артефакты загрузки для загрузки изображения на следующем этапе.

Вы можете проверить пример ниже:

1, В этапе сборки добавьте Docker@0 ( версия 0. *) после DockerCompose для запуска команды сохранения образа для сохранения изображения в папку $(Build.ArtifactStagingDirectory)

- task: Docker@0
  displayName: 'Run a Docker command'
  inputs:
    containerregistrytype: 'Azure Container Registry'
    azureSubscription: '************'
    azureContainerRegistry: '************'
    action: 'Run a Docker command'
    customCommand: 'image save <imageName>:$(Build.BuildId) -o $(Build.ArtifactStagingDirectory)/imagetest.tar'

2, поставьте задачу артефакта publi sh в конце Этап сборки, чтобы опубликовать sh изображение

- publish:  $(Build.ArtifactStagingDirectory)
  artifact: docker-images

3, Теперь вы можете скачать файл архива изображений из этапа сборки на этап Publi sh. И вы можете запустить команду docker load , чтобы загрузить образ архива. После того, как он будет загружен, вы можете добавить его в ACR

- download: current
  artifact: docker-images

- task: Docker@0
  displayName: 'Run a Docker command'
  inputs:
    containerregistrytype: 'Azure Container Registry'
    azureSubscription: '************'
    azureContainerRegistry: '************'
    action: 'Run a Docker command'
    customCommand: 'load --input $(Pipeline.Workspace)/docker-images/imagetest.tar'

Надеюсь, что это поможет!

0 голосов
/ 13 апреля 2020

Вы указываете

pool:
  vmImage: 'ubuntu-latest'

Это означает, что каждый этап извлекает пустой sh образ виртуальной машины из размещенного в Microsoft конвейерного пула Microsoft и запускает на нем команды. Ваша сборка не сохраняется.

Таким образом, краткий ответ "вы не можете". Если вы хотите, чтобы состояние сохранялось для всех заданий, вам нужно создать выделенного частного агента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...