You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让整个Azure Pipeline全程在Docker容器内运行且不中途停止?

解决Azure Pipeline容器跨阶段构建产物丢失问题

你的核心问题是:每个阶段的容器任务结束后会被销毁,容器内生成的构建产物(mvn deploy输出)无法自动传递到后续阶段的容器中。要解决这个问题,需要通过流水线的共享工件机制在阶段间传递产物,而不是依赖容器内的本地文件。

具体解决方案步骤:

1. 在Build阶段(mvn deploy)中,将产物同步到流水线共享目录并发布

修改Build阶段的job,在mvn deploy完成后,把生成的产物(比如target/下的jar包)复制到流水线的$(Build.ArtifactStagingDirectory)(Azure Pipeline默认的共享工件目录),然后发布为Pipeline Artifact:

- stage: Build
  dependsOn: SetupMaven
  jobs:
  - job: Build_job
    displayName: Build
    container: dockerContainer
    steps:
      - script: mvn deploy -DskipTests
        displayName: 'Maven Deploy'
      # 复制构建产物到流水线共享目录
      - script: |
          mkdir -p $(Build.ArtifactStagingDirectory)/target
          cp -r target/* $(Build.ArtifactStagingDirectory)/target/
        displayName: 'Copy Build Artifacts to Staging'
      # 发布为Pipeline Artifact,供后续阶段下载
      - publish: $(Build.ArtifactStagingDirectory)/target
        artifact: maven-build-output

2. 在Docker Build阶段,先下载共享工件再执行构建

新增(或修改)Docker Build阶段,首先下载前面发布的maven-build-output工件到当前阶段的工作目录,再在容器内执行docker build:

- stage: Docker_Build
  dependsOn: Build
  jobs:
  - job: Docker_Build_Job
    displayName: Docker Build & Push
    container: dockerContainer
    steps:
      # 下载前面阶段发布的构建产物
      - download: current
        artifact: maven-build-output
        displayName: 'Download Maven Build Artifacts'
      # 执行Docker Build,注意Dockerfile要指向下载的产物路径
      - script: |
          docker build -t your-image-name:$(Build.BuildId) -f Dockerfile $(Pipeline.Workspace)/maven-build-output
        displayName: 'Docker Build'
      # 后续的ECR发布步骤...

关键原理说明:

  • Azure Pipeline中,每个job的容器是独立的运行实例,容器退出后内部文件会被清理,不会自动同步到代理机器的工作区。
  • $(Build.ArtifactStagingDirectory)和$(Pipeline.Workspace)是代理机器上的共享目录,所有阶段/job都能访问,通过publish和download命令可以在阶段间传递文件。
  • 不管是自托管代理还是微软托管代理,这个机制都能正常工作。

额外优化建议:

  • 如果你的Dockerfile需要从本地复制jar包,确保Dockerfile中的COPY路径指向下载后的工件目录(比如$(Pipeline.Workspace)/maven-build-output/your-app.jar .)。
  • 不需要在每个阶段都重复定义容器,只要在流水线顶层定义containers后,job中直接引用即可(你当前的配置已经这么做了,保持即可)。

内容的提问来源于stack exchange,提问作者Dev0001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:57:04