使用 docker-compose.test.yml 定义隔离测试环境,通过 up -d --wait 启动、运行测试、down -v --rmi local 清理,配合 tmpfs 卷、健康检查、独立 project_name 确保每次测试完全隔离。

直接用 docker-compose 在 CI 流水线中拉起隔离的集成测试环境,核心是“一次定义、每次重建、完全隔离”。不需要复用容器或保留状态,重点是让每次测试都从干净镜像启动一套全新服务栈。
准备专用的测试编排文件
不要复用生产或开发用的 docker-compose.yml。在项目根目录新建 docker-compose.test.yml,只包含测试必需的服务(如应用 + 数据库 + 缓存),并显式指定版本、网络、健康检查和依赖顺序:
- 用
version: "3.8"或更高,确保兼容主流 CI 平台 - 为每个服务设
restart: "no",避免测试中途意外重启 - 用
depends_on: [db]+healthcheck确保应用等数据库就绪后再启动 - 所有卷(volumes)用
tmpfs或命名卷加driver_opts: {type: tmpfs},保证测试结束即销毁数据
在CI脚本中精准控制生命周期
测试前拉起、测试后清理必须原子化执行,推荐在 CI 脚本(如 GitHub Actions 的 steps 或 Jenkins Pipeline 的 sh 块)中写成三步:
- 启动:运行
docker compose -f docker-compose.test.yml up -d --wait(--wait是 Docker Compose v2.15+ 支持的原生等待健康检查通过的选项) - 运行测试:调用你的测试命令(如
pytest tests/或npm test),确保它能通过服务名(如http://app:8000)访问其他容器 - 清理:无论测试成功或失败,都执行
docker compose -f docker-compose.test.yml down -v --rmi local,删掉容器、网络、临时卷和本次构建的本地镜像
加速镜像构建与复用
CI 中最耗时环节常是镜像构建。可结合以下方式提速:
- 对被测服务使用多阶段构建(multi-stage),在
Dockerfile中分离构建与运行环境,减小最终镜像体积 - 在 CI 配置中启用 BuildKit(
export DOCKER_BUILDKIT=1),支持缓存分层复用 - 若测试不依赖最新代码,可提前构建并推送到私有 Registry,CI 中直接
pull;否则用docker compose build --cache-from指定缓存源 - 第三方服务(如 PostgreSQL、Redis)直接用官方镜像,不重新打包,避免维护成本
验证环境是否真正隔离
隔离失效常导致测试“偶然通过”。可通过这几个信号快速判断:
- 测试容器内无法访问宿主机端口(如
curl http://host.docker.internal:3000应失败,除非显式开启) - 多个并行流水线同时运行时,各自的
docker-compose.test.yml使用不同project_name(如docker compose -p ci-${{ github.run_id }} -f ... up),避免容器名或网络名冲突 - 测试结束后执行
docker network ls | grep your_project_name,应无残留网络 - 日志里不出现
port already in use或connection refused(除预期的启动等待外)


















