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
相关产品推荐
相关产品推荐

