GitLab CI构建镜像报错无法连接tcp://docker:2375 Docker守护进程
问题场景
将Django项目推送至GitLab仓库,计划通过GitLab CI流水线完成Docker镜像构建与推送,流水线执行时持续抛出错误:
Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?
原有流水线配置如下:
stages: - build variables: IMAGE_TAG: $CI_REGISTRY_IMAGE/commits:$CI_COMMIT_SHA build-docker-image: stage: build tags: - docker image: docker:19.03.12 services: - docker:19.03.12-dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker build -t $IMAGE_TAG . - docker push $IMAGE_TAG only: - main
故障原因
- Docker-in-Docker(dind)服务运行要求执行Job的Runner开启特权模式,自托管Runner默认未开启该配置时,无法正常启动dind守护进程。
- docker:19.03版本之后的dind镜像默认开启TLS认证,原有配置未指定Docker客户端连接参数,导致客户端无法通过2375端口和守护进程建立连接。
- 原有配置中
docker login命令被错误拆分为两行,会触发命令执行语法问题。
修复步骤
- 检查绑定
docker标签的GitLab Runner配置,确保Runner配置文件中对应Runner的privileged参数设置为true,修改后重启Runner生效。 - 在流水线全局变量中补充Docker客户端连接配置,关闭dind的TLS校验(内部CI网络环境下该配置无安全风险),同时指定overlay2存储驱动提升构建稳定性。
- 修正
docker login命令的换行问题,将仓库地址参数和登录命令放在同一行。
修复后的完整可用配置:
stages: - build variables: IMAGE_TAG: $CI_REGISTRY_IMAGE/commits:$CI_COMMIT_SHA DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" DOCKER_DRIVER: overlay2 build-docker-image: stage: build tags: - docker image: docker:19.03.12 services: - docker:19.03.12-dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker build -t $IMAGE_TAG . - docker push $IMAGE_TAG only: - main
补充说明
- 若使用GitLab官方提供的共享Runner,默认已开启特权模式,无需手动调整Runner配置。
- 若后续升级Docker版本到20.10+且需要保留TLS认证,可移除
DOCKER_TLS_CERTDIR: ""配置,将dind服务的证书目录挂载到Job容器即可,整体配置复杂度更高,无特殊要求优先使用无TLS的简化配置。 - 不要手动覆盖GitLab自动注入的
CI_REGISTRY、CI_REGISTRY_USER、CI_REGISTRY_PASSWORD内置变量,避免镜像仓库登录失败。
内容的提问来源于stack exchange,提问作者FabianxS
相关产品推荐
相关产品推荐

