用 docker compose 搭建微服务 ci 测试环境的核心是实现每次测试从干净状态开始、依赖可复现、验证自动化;通过独立的 docker-compose.test.yml 编排,配合 tester 服务、健康检查、退出码驱动和脚本断言,一条命令即可完成拉镜像、启依赖、跑服务、执行测试、输出结果与自动清理的闭环流程。

用 Docker Compose 搭建微服务持续集成(CI)测试环境,关键在于“每次测试都从干净状态开始、依赖可复现、验证自动化”。它不是只让服务跑起来,而是构建一个可重复、隔离、带验证闭环的轻量级 CI 流水线。本地或 CI 服务器上一条 docker compose -f docker-compose.test.yml up --exit-code-from tester 就能完成拉镜像、启依赖、跑服务、执行测试、输出结果、自动清理的全过程。
一、准备基础运行时:Docker + Compose v2.20+
确保宿主机已安装 Docker Engine(非 Desktop)和 Docker Compose v2.20 或更高版本(v2.27+ 更稳)。推荐使用官方一键脚本安装(Linux/macOS/WSL2 通用),它会自动配置国内镜像加速源(如轩辕镜像站),避免拉取 MySQL、Redis、Nacos 等基础镜像超时:
- 执行:
curl -sSL https://get.docker.com | sh→ 安装 Docker - 再运行:
sudo apt-get install docker-compose-plugin(Ubuntu/Debian)或直接下载二进制:sudo curl -L "https://github.com/docker/compose/releases/download/v2.30.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose - 验证:
docker --version和docker compose version均有正常输出即成功
二、设计双模编排文件:开发用 docker-compose.yml,测试用 docker-compose.test.yml
分离关注点:开发环境重在调试便利,测试环境重在纯净与可断言。CI 测试应使用独立的 YAML 文件,不复用开发配置,避免端口暴露、日志挂载等干扰项。
-
测试专用编排要点:
- 所有服务设
restart: "no",防止测试失败后自动重试掩盖问题 - 数据库服务启用初始化 SQL(通过
volumes挂载./sql/init.sql到容器内对应路径,如 MySQL 的/docker-entrypoint-initdb.d/) - 增加专用
tester服务:基于 Alpine 或 Ubuntu 镜像,内置curl、jq、mysql-client等工具,负责调用 API + 查询 DB + 断言结果 - 用
depends_on+healthcheck控制启动顺序(例如 MySQL 必须healthy后,tester 才启动)
- 所有服务设
-
示例 tester 服务片段:
tester: image: alpine:latest depends_on: api: condition: service_started db: condition: service_healthy volumes: - ./test-scripts:/scripts command: sh -c "sh /scripts/run-tests.sh && echo '✅ All tests passed' || (echo '❌ Tests failed'; exit 1)"
三、实现自动验证闭环:测试脚本 + 健康检查 + 退出码驱动
CI 环境的核心是“可判断成功与否”。不能靠人盯日志,而要靠退出码(exit code)被 CI 工具(如 GitHub Actions、Jenkins)捕获。
-
数据库健康检查写法(MySQL 示例):
db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: testdb healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] interval: 30s timeout: 10s retries: 5 -
测试脚本逻辑建议(
run-tests.sh):- 用
curl -s http://api:8000/health确认服务就绪 - 调用接口(如
curl -X POST http://api:8000/users)并保存响应 - 用
mysql -h db -uroot -proot testdb -e "SELECT COUNT(*) FROM users;"查库验证数据落库 - 用
jq解析 JSON 响应,校验字段(如jq -e '.code == 200' response.json) - 任意一步失败则
exit 1,保证整个docker compose up返回非零码
- 用
四、接入真实 CI 流水线:GitHub Actions 示例
把这套本地可运行的测试,无缝迁移到 GitHub Actions 只需几行 YAML:
- 在项目根目录添加
.github/workflows/ci.yml - 关键步骤:
- name: Set up Docker Buildx uses: docker/setup-buildx-action@v3
- name: Start test environment run: docker compose -f docker-compose.test.yml up --exit-code-from tester --timeout 300
- GitHub Actions 会自动捕获该命令的退出码:0 → ✅ Success,非 0 → ❌ Failure 并标红流水线
整套方案不依赖 Jenkins 插件或复杂平台,纯 Docker 原生能力驱动。每次测试都是全新容器、干净数据库、固定网络拓扑,彻底规避“本地能过 CI 报错”的陷阱。真正做到了——写一次,处处可测。











