Docker中GitLab Runner无法连接dind的Docker守护进程求助
我知道这可能被视为重复问题,但尝试了网上所有方法仍未解决。我正尝试在Windows系统通过Docker Desktop搭建本地gitlab-ce服务器,经验不足无法解决错误,可能对情况理解不够透彻。
能在gitlab实例中看到活跃的runner,但运行流水线时持续出现以下错误:
ERROR: Failed to remove network for build
ERROR: Preparation failed: Cannot connect to the Docker daemon at tcp://dind:2375. Is the docker daemon running? (docker.go:933:12s)
http://gitlab.playground.local已在Windows主机文件中配置,可正常访问该实例,但runner存在问题。
Docker Compose配置
services: dind: container_name: dind image: docker:25.0.3-dind restart: unless-stopped privileged: true environment: DOCKER_TLS_CERTDIR: "" command: - --storage-driver=overlay2 networks: - playground volumes: - D:/Playground/data/gitlab-runner/dind:/var/lib/docker runner: container_name: runner image: gitlab/gitlab-runner:alpine-v16.9.0 restart: unless-stopped environment: - DOCKER_HOST=tcp://dind:2375 networks: - playground volumes: - D:/Playground/conf/gitlab-runner:/etc/gitlab-runner:z register-runner: container_name: registerrunner image: gitlab/gitlab-runner:alpine-v16.9.0 restart: 'no' depends_on: - dind environment: - CI_SERVER_URL=http://gitlab.playground.local/ - RUNNER_TOKEN=... command: - register - --non-interactive - --url=http://gitlab.playground.local/ - --token=... - --name=Runner - --executor=docker - --docker-image=docker:25.0.3-dind - --docker-volumes=/var/run/docker.sock:/var/run/docker.sock networks: - playground volumes: - D:/Playground/conf/gitlab-runner:/etc/gitlab-runner:z - D:/Playground/data/gitlab-runner/dind:/var/lib/docker networks: playground: name: playground driver: bridge
config.toml配置
concurrent = 1 check_interval = 0 log_level = "debug" log_format = "text" connection_max_age = "15m0s" shutdown_timeout = 0 [session_server] session_timeout = 1800 [[runners]] name = "Runner" url = "http://gitlab.playground.local/" id = 34 token = "..." token_obtained_at = 2024-02-22T03:30:08Z token_expires_at = 0001-01-01T00:00:00Z executor = "docker" [runners.cache] MaxUploadedArchiveSize = 0 [runners.docker] host = "tcp://dind:2375" tls_verify = false image = "docker:25.0.3-dind" privileged = true disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"] cache_dir = "cache" shm_size = 0 network_mtu = 0
补充信息
- 经过大量试错得到当前配置,也曾尝试不使用Docker-in-Docker以降低复杂度,但仍出现异常。
- 尝试通过
usermod -aG docker gitlab-runner处理权限问题,但alpine系统无usermod命令,因此按建议在docker compose文件中添加了user: 2000:2000属性,但仍未成功。 - 已在Docker中暴露无TLS的守护进程
tcp://localhost:2375,但无任何变化。
针对你遇到的Docker daemon连接问题,从配置来看主要有几个关键点需要调整:
1. 暴露Dind容器的2375端口
你的dind容器没有对外暴露2375端口,导致runner无法访问内部的Docker daemon。在dind服务配置中添加ports字段:
services: dind: # 保留原有配置 ports: - "2375:2375"
2. 移除Runner配置中不必要的Docker sock挂载
使用Dind模式时,runner应通过TCP连接dind容器的daemon,而非挂载宿主的/var/run/docker.sock。修改config.toml中的volumes配置:
[[runners]] [runners.docker] # 保留其他配置 volumes = ["/cache"] # 删除/var/run/docker.sock的挂载项
3. 确保Dind容器的Docker daemon监听正确地址
修改dind容器的启动命令,明确让daemon监听所有网卡的2375端口:
services: dind: command: - --storage-driver=overlay2 - --host=tcp://0.0.0.0:2375
4. 验证网络连通性
在runner容器内执行以下命令,测试是否能连接到dind容器的Docker daemon:
docker exec runner curl http://dind:2375/version
如果返回Docker版本信息,说明网络连通正常;否则检查playground网络是否正常创建,所有容器是否都加入了该网络。
5. 调整Runner的启动依赖
depends_on仅保证容器启动顺序,无法确保dind的daemon就绪。可以给runner添加健康检查,或者手动等待dind容器启动完成后再启动runner服务:
services: runner: # 保留原有配置 depends_on: dind: condition: service_started healthcheck: test: ["CMD", "docker", "info"] interval: 10s timeout: 5s retries: 3
内容的提问来源于stack exchange,提问作者Miojj

