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

Azure CI流水线:如何运行Docker容器供后续任务/阶段调用

你的问题出在docker run默认以前台模式运行,导致StartAPI阶段的任务一直卡着,没法进入后续的UseAPI阶段。核心解决思路是:后台启动容器,记录容器ID,等UseAPI阶段完成后用这个ID停止并清理容器。

下面是主流CI平台的实现示例:

Azure DevOps 流水线

stages:
- stage: StartAPI
  jobs:
  - job: RunDockerAPI
    displayName: 启动API容器
    steps:
    - script: |
        # 后台启动容器,把容器ID写入文件
        CONTAINER_ID=$(docker run -d -p 80:80 your-api-image:latest)
        echo $CONTAINER_ID > container_id.txt
      displayName: '后台启动Docker容器'
    # 把容器ID文件作为工件传给下一个阶段
    - publish: $(System.DefaultWorkingDirectory)/container_id.txt
      artifact: container-id

- stage: UseAPI
  dependsOn: StartAPI
  jobs:
  - job: UseDockerAPI
    displayName: 调用API并停止容器
    steps:
    # 下载前一阶段的容器ID文件
    - download: current
      artifact: container-id
    - script: |
        # 调用API接口
        curl http://127.0.0.1
      displayName: '执行cURL调用API'
    - script: |
        # 读取容器ID,停止并删除容器
        CONTAINER_ID=$(cat $(Pipeline.Workspace)/container-id/container_id.txt)
        docker stop $CONTAINER_ID
        docker rm $CONTAINER_ID
      displayName: '清理Docker容器'
  • 用-d参数让容器后台运行,避免任务阻塞
  • 通过Azure的**工件(artifact)**机制传递容器ID到后续阶段
  • 最后阶段完成API调用后,清理容器

GitHub Actions 流水线

name: API测试流水线

on: [push]

jobs:
  start-api:
    runs-on: ubuntu-latest
    # 定义输出变量,传递容器ID给下一个任务
    outputs:
      container-id: ${{ steps.start-container.outputs.container-id }}
    steps:
      - name: 后台启动API容器
        id: start-container
        run: |
          CONTAINER_ID=$(docker run -d -p 80:80 your-api-image:latest)
          # 把容器ID写入GitHub输出变量
          echo "container-id=$CONTAINER_ID" >> $GITHUB_OUTPUT

  use-api:
    # 依赖start-api任务完成
    needs: start-api
    runs-on: ubuntu-latest
    steps:
      - name: 调用API
        run: curl http://127.0.0.1
      - name: 停止并清理容器
        run: |
          docker stop ${{ needs.start-api.outputs.container-id }}
          docker rm ${{ needs.start-api.outputs.container-id }}
  • docker run -d后台启动容器,避免任务挂起
  • 用GitHub Actions的输出变量机制传递容器ID
  • 依赖任务直接引用前序任务的输出变量完成容器清理

GitLab CI 流水线

stages:
  - start_api
  - use_api

start_api:
  stage: start_api
  script:
    - CONTAINER_ID=$(docker run -d -p 80:80 your-api-image:latest)
    # 把容器ID写入环境变量文件
    - echo "CONTAINER_ID=$CONTAINER_ID" >> build.env
  # 通过dotenv工件传递环境变量
  artifacts:
    reports:
      dotenv: build.env

use_api:
  stage: use_api
  # 依赖start_api阶段完成
  needs: [start_api]
  script:
    - curl http://127.0.0.1
    # 直接使用传递过来的CONTAINER_ID变量清理容器
    - docker stop $CONTAINER_ID
    - docker rm $CONTAINER_ID
  • 同样用-d后台启动容器
  • GitLab的dotenv工件可以直接传递环境变量到后续阶段
  • 后续阶段无需额外读取文件,直接使用环境变量操作容器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:05:26