You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在GitLab CI/CD中连接Docker Compose启动的正常运行服务?

如何在GitLab CI/CD中连接Docker Compose启动的正常运行服务?

嘿,我看了你提供的GitLab CI配置,你已经在尝试用Docker-in-Docker(dind)来启动服务并做集成测试,但这里面有几个小细节可能会导致你无法正常连接到Compose启动的服务,我给你拆解问题并调整配置:

首先先聊聊原配置里的几个潜在坑:

  • eth0获取RUNNER_IP不太可靠,GitLab Runner的Docker容器网络环境可能会变化,其实有更简单的访问方式
  • 重复安装Docker完全没必要,你已经启用了docker:dind服务,CI容器里本身就有Docker客户端可用
  • 硬编码sleep 10来等服务启动太不稳定,最好用健康检查或者轮询脚本确保服务真的就绪

下面是调整后的完整CI配置,我标注了关键修改点:

stages:
  - test

variables:
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ""  # 禁用TLS,简化dind连接配置
  DOCKER_HOST: tcp://docker:2375  # 直接连接到dind服务的Docker守护进程

integration_test:
  image: cypress/base
  stage: test
  services:
    - name: docker:dind
      alias: docker  # 给dind服务起别名,方便后续调用
  before_script:
    # 不需要额外安装Docker,依赖镜像或dind服务已经提供客户端
    - docker --version
    # 用GitLab内置变量替代硬编码TOKEN,更安全且易维护
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    # 确保docker-compose工具可用(部分基础镜像可能未预装)
    - curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    - chmod +x /usr/local/bin/docker-compose
    - docker-compose --version
  script:
    # 启动服务(如果你的docker-compose.yml里已指定镜像,无需手动pull,Docker会自动处理)
    - docker-compose up -d
    # 用轮询脚本替代sleep,确保服务真的就绪
    - |
      until curl -s http://localhost:8082/hello; do
        echo "Waiting for service-b to be ready..."
        sleep 2
      done
    - docker ps  # 验证服务容器是否正常启动
    - curl http://localhost:8082/hello  # 测试服务连通性
    - npm install
    # Cypress直接用localhost访问服务,无需依赖外部IP
    - npx cypress run --spec cypress/integration/serviceb_that_calls_servicea.js --config baseUrl=http://localhost:8082

再补充几个关键注意事项:

  • 网络与端口配置:确保你的docker-compose.yml里的服务端口绑定到0.0.0.0,并且端口映射正确(比如8082:8082),这样CI容器里的localhost就能直接访问到dind中启动的服务
  • 服务健康检查优化:如果给你的服务添加健康检查配置(写在docker-compose.yml里),可以用更优雅的方式等待服务就绪:
    service-b:
      image: registry.gitlab.com/a.bovi-work/tests-template/service-b:latest
      ports:
        - "8082:8082"
      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:8082/hello"]
        interval: 5s
        timeout: 5s
        retries: 5
    
    之后在CI脚本里可以替换轮询为:
    - docker-compose up --wait
    
  • 变量安全:永远不要在配置里硬编码敏感信息(比如TOKEN),用GitLab项目的「CI/CD变量」来存储,既安全又方便修改

如果还是遇到连接问题,可以排查这几点:

  1. 查看CI日志里的docker ps输出,确认服务容器是否正常启动
  2. 检查docker-compose.yml的端口映射是否正确,有没有和CI容器的端口冲突
  3. 尝试用docker inspect <服务容器名>查看容器IP,直接用该IP访问,排查网络链路问题

备注:内容来源于stack exchange,提问作者Kambei

火山引擎 最新活动