GitLab CI用docker-compose跑集成测试无法连接Docker daemon报错
GitLab CI共享Runner运行docker-compose报Docker daemon 2375端口连接失败修复方案
问题场景
- 开发对接Postgres的Node.js应用,已完成容器化,配套docker-compose配置本地运行集成测试正常
- 目标:在GitLab CI共享Runner中执行
docker-compose up跑自动化集成测试 - 已尝试无效方案:官方默认DinD配置、切换多版本Docker、参考通用docker-compose build配置
- 报错信息:执行
docker info时返回Cannot connect to the Docker daemon at tcp://localhost:2375. Is the docker daemon running?
可直接落地的修复步骤
1. 修正.gitlab-ci.yml配置(适配共享Runner逻辑)
共享Runner和私有Runner的网络、证书逻辑有差异,不要直接抄私有部署的DinD配置,以下是验证可用的配置模板:
stages: - integration_test # 声明DinD服务,不要手动改dind镜像的启动命令 services: - docker:dind variables: # 固定TLS证书目录,适配共享Runner的证书自动挂载逻辑 DOCKER_TLS_CERTDIR: "/certs" DOCKER_COMPOSE_VERSION: "2.20.3" # 禁止手动添加DOCKER_HOST: tcp://localhost:2375配置,硬写地址会直接覆盖GitLab自动注入的正确服务地址,导致连接失败 integration_test: stage: integration_test image: docker:latest # 核心:必须开启特权模式,否则DinD服务无权限启动,2375端口不会监听 privileged: true tags: # 选择共享Runner池中支持docker特权模式的Runner标签,不要用默认的通用共享标签 - shared-docker-privileged before_script: # 安装固定版本docker-compose,避免apk源内置老版本兼容性问题 - apk add --no-cache curl - 下载对应v2.20.3版本的docker-compose Linux x86_64二进制文件到`/usr/local/bin/docker-compose`路径 - chmod +x /usr/local/bin/docker-compose # 验证Docker连接状态 - docker info script: # 先启动Postgres依赖,等待服务健康检查通过 - docker-compose up -d --wait postgres # 启动Node.js应用执行集成测试,测试结束后自动终止所有容器 - docker-compose up --abort-on-container-exit --exit-code-from app
2. 权限兜底检查
如果配置完还是报同样的错,直接联系GitLab实例管理员确认两点:
- 所在项目的CI Job是否被允许开启
privileged: true权限,部分共享Runner池默认禁止普通项目开特权模式 - 所在项目是否被允许拉取
docker:dind服务镜像,部分内网环境会屏蔽公网镜像源导致dind服务拉取失败,端口自然无监听
3. 常见无效操作避坑
- 不要切换19.03以下版本的Docker/dind镜像:老版本默认关闭TLS校验,和当前共享Runner的证书逻辑不兼容
- 不要在脚本里手动执行
dockerd启动守护进程:services声明的dind服务会自动启动daemon,手动启动会触发端口冲突 - 不要给docker-compose加
-H localhost:2375的强制主机参数,会绕过CI自动注入的正确连接地址
内容的提问来源于stack exchange,提问作者Diaboloxx
相关产品推荐
相关产品推荐

