Docker compose 在多阶段Azure Devops中访问Docker映像

Docker compose 在多阶段Azure Devops中访问Docker映像,docker-compose,azure-devops,Docker Compose,Azure Devops,我正在构建一个Azure DevOps管道,并正在尝试多阶段功能,这是通过使用yml文件定义的 在yml定义中,我有两个阶段,一个是使用docker compose命令构建docker图像,第二个阶段是将这些图像推送到ACR。这似乎是不可能的,因为我还没有从第一阶段成功访问最近构建的图像。 这是一个示例yml文件 stages: - stage: Build displayName: Build image jobs: - job: Build displayName:

我正在构建一个Azure DevOps管道,并正在尝试多阶段功能,这是通过使用yml文件定义的

在yml定义中,我有两个阶段,一个是使用docker compose命令构建docker图像,第二个阶段是将这些图像推送到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和push,它可以正常工作,但我希望每个阶段都有一个单独的阶段。

您正在指定

pool:
  vmImage: 'ubuntu-latest'
这意味着每个阶段都从Microsoft托管的管道池中提取一个新的空白VM映像,并在其上运行命令。您的构建不会持久


所以简单的回答是“你不能”。如果希望状态在作业之间保持不变,则需要创建专用的私有代理

首先,您应该始终将发布工件任务放在阶段的末尾。或者只发布一个空文件夹

其次,dock compose命令生成图像并将其保存在托管计算机上的docker文件夹中。不会向代理的artifacts文件夹
$(Build.artifactstagindirectory)
输出任何内容

作为在阶段之间传递docker映像的解决方法,您可以使用
docker image save
命令将映像专门保存在文件夹
$(Build.artifactStaginDirectory)
中。并使用发布工件任务将映像发布到azure devops服务器。然后,您可以在下一阶段使用下载工件来下载图像

您可以查看以下示例:

1、在构建阶段添加一个Docker@0(版本0.*)在DockerCompose任务之后运行图像保存命令,将图像保存到文件夹
$(Build.ArtifactStagingDirectory)

3,现在您可以从构建阶段下载映像存档文件到发布阶段。您可以运行命令来加载存档映像。加载后,您可以将其推送到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'
希望以上帮助

- publish:  $(Build.ArtifactStagingDirectory)
  artifact: docker-images
- 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'