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

如何仅在指定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命令

如果需要更细粒度的控制,可以分三步执行:

  1. 启动所有依赖的后台服务并保持运行:
- 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"
  1. 等待Spicedb服务就绪(可选但建议,避免测试因服务未启动失败):
    添加脚本步骤检查端口状态:
# 等待Spicedb的gRPC端口就绪
until nc -z spicedb 50051; do
  echo "Waiting for Spicedb to start..."
  sleep 2
done
  1. 单独运行测试容器,测试完成后停止所有服务:
- 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:05:10