如何仅在指定auth-api容器完成后终止Docker Compose?
解决Docker Compose在Azure CI中仅在测试容器完成后停止的问题
方案1:使用--exit-code-from参数(推荐)
Docker Compose的--exit-code-from参数可以指定以目标容器的退出状态作为整个docker compose up命令的退出码,并且当该容器退出时自动停止所有服务。完美适配你的场景:
- 替换原命令中的
--abort-on-container-exit为--exit-code-from auth-api - 即使
migrate容器正常退出,整个Compose进程会持续运行直到auth-api完成测试退出 - CI管道会拿到
auth-api的测试结果退出码,用于判断测试是否通过
修改后的Azure管道步骤:
- task: DockerCompose@1 displayName: test auth-api inputs: action: Run a Docker Compose command dockerComposeFile: projects/auth-api-docker-compose.yml dockerComposeCommand: up --build --force-recreate --exit-code-from auth-api --remove-orphans dockerComposePath: "/usr/libexec/docker/cli-plugins/docker-compose" projectName: "test-auth-api"
方案2:分阶段执行Compose命令
如果需要更细粒度的控制,可以分三步执行:
- 启动所有依赖的后台服务并保持运行:
- task: DockerCompose@1 displayName: Start backend services inputs: action: Run a Docker Compose command dockerComposeFile: projects/auth-api-docker-compose.yml dockerComposeCommand: up --build --force-recreate -d mssql-db database migrate spicedb dockerComposePath: "/usr/libexec/docker/cli-plugins/docker-compose" projectName: "test-auth-api"
- 等待Spicedb服务就绪(可选但建议,避免测试因服务未启动失败):
添加脚本步骤检查端口状态:
# 等待Spicedb的gRPC端口就绪 until nc -z spicedb 50051; do echo "Waiting for Spicedb to start..." sleep 2 done
- 单独运行测试容器,测试完成后停止所有服务:
- task: DockerCompose@1 displayName: Run auth-api tests inputs: action: Run a Docker Compose command dockerComposeFile: projects/auth-api-docker-compose.yml dockerComposeCommand: run --rm auth-api bal test dockerComposePath: "/usr/libexec/docker/cli-plugins/docker-compose" projectName: "test-auth-api" - task: DockerCompose@1 displayName: Stop all services inputs: action: Run a Docker Compose command dockerComposeFile: projects/auth-api-docker-compose.yml dockerComposeCommand: down dockerComposePath: "/usr/libexec/docker/cli-plugins/docker-compose" projectName: "test-auth-api"
方案3:调整migrate服务的行为(不推荐)
修改migrate服务,让它在完成迁移后保持运行一个无意义进程,直到被终止:
migrate: image: "authzed/spicedb" command: sh -c "migrate head && tail -f /dev/null" # 其他配置保持不变
这种方式属于hack手段,虽然能避免migrate容器退出导致Compose终止,但不够优雅,不推荐在CI环境中使用。
内容的提问来源于stack exchange,提问作者Tharindu Weerasinghe
相关产品推荐
相关产品推荐

