Ubuntu WSL中GitLab CI无法连接Docker daemon求助
GitLab CI(WSL环境)Docker Daemon连接失败问题解决
问题背景
在Ubuntu WSL环境中运行包含测试、构建、部署的GitLab CI流水线时,构建阶段报错:
ERROR: Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?
已尝试调整挂载卷、环境变量、添加sleep、设置别名等方案,问题仍未解决。相关配置及日志如下:
CI配置文件
stages: - test - build - deploy variables: IMAGE_NAME: tonkaxxx/pipeline-app IMAGE_TAG: v1 DOCKER_TLS_CERTDIR: "/certs" DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 unit-test-job: stage: test tags: - runner image: alpine:latest script: - echo "Running unit tests.." - sleep 1 - echo "Tests completed successfully!" build-job: stage: build tags: - runner image: docker:stable services: - name: docker:19-dind entrypoint: ["dockerd-entrypoint.sh", "--tls=false"] alias: docker script: - sleep 45 - export DOCKER_HOST=tcp://127.0.0.1:2375 - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD - docker info - docker build -t $IMAGE_NAME:$IMAGE_TAG . - docker push $IMAGE_NAME:$IMAGE_TAG deploy-job: stage: deploy tags: - runner image: docker:stable services: - name: docker:19-dind alias: docker - name: docker/compose:1.29.2 script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD - echo "Deploying application..." - docker-compose down || true - docker-compose up -d --build
Runner config.toml配置
[[runners]] name = "runner" url = "https://gitlab.com/" id = token = "g070mhix" token_obtained_at = 2025-05-25T18:08:57Z token_expires_at = 0001-01-01T00:00:00Z executor = "docker" [runners.cache] MaxUploadedArchiveSize = 0 [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure] [runners.docker] tls_verify = false image = "docker:stable" privileged = true disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/etc/docker/certs.d:/etc/docker/certs.d", "/var/run/docker.sock:/var/run/docker.sock", "/cache"] pull_policy = ["if-not-present"] shm_size = 0 network_mtu = 0
关键作业日志片段
*** WARNING: Service runner-bgw15whll-project-70186504-concurrent-0-2b64643ee6971f10-docker-0 probably didn't start properly. Health check error: service "runner-bgw15whll-project-70186504-concurrent-0-2b64643ee6971f10-docker-0-wait-for-service" timeout ... 2025-05-26T11:31:55.048186124Z failed to load listeners: can't create unix socket /var/run/docker.sock: device or resource busy ... $ docker info Client: Debug Mode: false Server: ERROR: Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?
错误原因分析
- Docker Socket冲突:Runner配置中挂载了宿主WSL的
/var/run/docker.sock到容器内部,同时启动docker:dind服务,导致dind容器尝试创建自身socket时被占用,启动失败。 - DOCKER_HOST配置矛盾:全局变量设置
DOCKER_HOST: tcp://docker:2375/指向dind服务容器,但脚本中又覆盖为tcp://127.0.0.1:2375,而127.0.0.1是当前job容器的localhost,并非dind服务地址。 - TLS配置冲突:设置
DOCKER_TLS_CERTDIR: "/certs"但给dind服务添加--tls=false参数,证书生成逻辑与禁用TLS的设置冲突,影响dind启动。
解决方案
1. 修改GitLab Runner配置(config.toml)
移除/var/run/docker.sock的挂载,避免与dind服务的socket冲突:
[[runners]] name = "runner" url = "https://gitlab.com/" id = token = "g070mhix" token_obtained_at = 2025-05-25T18:08:57Z token_expires_at = 0001-01-01T00:00:00Z executor = "docker" [runners.cache] MaxUploadedArchiveSize = 0 [runners.docker] tls_verify = false image = "docker:stable" privileged = true disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/etc/docker/certs.d:/etc/docker/certs.d", "/cache"] # 移除/var/run/docker.sock挂载 pull_policy = ["if-not-present"] shm_size = 0 network_mtu = 0
修改后重启GitLab Runner服务:
sudo gitlab-runner restart
2. 调整CI配置文件
- 禁用TLS时清空
DOCKER_TLS_CERTDIR变量,避免证书生成逻辑冲突 - 移除脚本中对
DOCKER_HOST的覆盖,使用服务别名docker访问dind - 延长服务等待时间,确保dind完全启动
修改后的CI配置:
stages: - test - build - deploy variables: IMAGE_NAME: tonkaxxx/pipeline-app IMAGE_TAG: v1 DOCKER_TLS_CERTDIR: "" # 禁用TLS时清空证书目录变量 DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 unit-test-job: stage: test tags: - runner image: alpine:latest script: - echo "Running unit tests.." - sleep 1 - echo "Tests completed successfully!" build-job: stage: build tags: - runner image: docker:stable services: - name: docker:19-dind entrypoint: ["dockerd-entrypoint.sh", "--tls=false"] alias: docker wait_timeout: 60 # 延长服务等待时间,按需调整 script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD - docker info - docker build -t $IMAGE_NAME:$IMAGE_TAG . - docker push $IMAGE_NAME:$IMAGE_TAG deploy-job: stage: deploy tags: - runner image: docker:stable services: - name: docker:19-dind entrypoint: ["dockerd-entrypoint.sh", "--tls=false"] alias: docker - name: docker/compose:1.29.2 script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD - echo "Deploying application..." - docker-compose down || true - docker-compose up -d --build
3. WSL环境额外检查
- 若WSL中直接安装了Docker,确保服务处于运行状态:
sudo service docker start
- 若使用Docker Desktop配合WSL,需在Docker Desktop设置中启用对应WSL发行版的集成。
内容的提问来源于stack exchange,提问作者tonkax
相关产品推荐
相关产品推荐

