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

如何在单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:54:04