如何在单个GitLab CI作业中运行多个Docker容器?
GitLab CI 多容器测试实现方案
完全可以实现,GitLab CI 原生支持两种主流方案满足需求:
方案1:使用 services 字段(轻量场景,组件数少于5个推荐)
GitLab CI 作业可直接声明依赖的服务容器,所有服务容器会与作业主容器自动处于同一网络,可直接通过服务别名互相访问,无需手动配置网络。
示例配置(依赖MySQL、Redis、自定义后端三个组件):
test: stage: test # 作业主容器镜像,对应你的测试运行环境,如Python/Node/Java对应版本 image: node:18 services: - name: mysql:8.0 alias: mysql # 该服务的访问域名就是mysql,如连接地址为jdbc:mysql://mysql:3306 - name: redis:7 alias: redis - name: your-registry.com/your-custom-component:latest # 你的私有组件镜像 alias: custom-component variables: # 可直接给服务容器传环境变量,如MySQL初始化配置 MYSQL_DATABASE: test_db MYSQL_ROOT_PASSWORD: test_pass script: # 先执行健康检查,等待所有组件启动完成 - until nc -z mysql 3306; do echo waiting for mysql; sleep 2; done - until nc -z redis 6379; do echo waiting for redis; sleep 2; done - until nc -z custom-component 8080; do echo waiting for custom component; sleep 2; done # 执行你的测试命令 - npm run test
该方案所有容器的创建、网络配置、销毁逻辑均由GitLab Runner自动处理,无需手动操作Docker。
方案2:Docker in Docker + docker-compose(复杂场景,组件多、有自定义编排需求推荐)
如果你的组件需要复杂启动参数、挂载配置文件、有启动顺序依赖,用docker-compose更灵活,示例配置:
test: stage: test image: docker:latest services: - docker:dind # 启用Docker in Docker能力 variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" before_script: # 安装docker-compose,若使用的镜像已预装可跳过该步骤 - apk add --no-cache docker-compose script: # 直接用项目内的docker-compose.yml启动所有组件 - docker-compose up -d # 等待所有组件健康启动,可自行编写健康检查逻辑 - sleep 10 # 执行测试,可直接调用服务接口,也可在对应容器内执行测试命令 - docker-compose exec -T backend-service go test ./... # 测试完成后可手动销毁资源,也可留到作业结束后由Runner自动清理 - docker-compose down
两种方案均可以在单个test阶段作业内完成全链路测试,无需手动逐个创建配置容器。
内容的提问来源于stack exchange,提问作者thebaconator
相关产品推荐
相关产品推荐

