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

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?

错误原因分析

  1. Docker Socket冲突:Runner配置中挂载了宿主WSL的/var/run/docker.sock到容器内部,同时启动docker:dind服务,导致dind容器尝试创建自身socket时被占用,启动失败。
  2. DOCKER_HOST配置矛盾:全局变量设置DOCKER_HOST: tcp://docker:2375/指向dind服务容器,但脚本中又覆盖为tcp://127.0.0.1:2375,而127.0.0.1是当前job容器的localhost,并非dind服务地址。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:17:02