自建GitLab Runner使用rootless DinD失败:无法连接Docker守护进程
我来帮你排查这个问题——你遇到的核心矛盾是:虽然Docker登录成功了,但后续无法连接到DinD的守护进程,这和你用了rootless Docker配置有直接关系,咱们一步步拆解:
问题根源分析
- 镜像版本与rootless配置不匹配:你的CI任务用了普通的
docker:18.09和docker:18.09-dind,但Runner默认镜像用的是docker:19.03-dind-rootless。Rootless DinD的默认端口不是普通DinD的2375,而是2376(默认带TLS加密),环境变量配置逻辑也完全不同,版本和模式的混搭直接导致了连接失败。 - 挂载的宿主机sock干扰了DinD服务:你在Runner配置里挂载了
/app/log/docker-rootless/docker.sock:/var/run/docker.sock,这会让CI任务优先尝试使用宿主机的Docker守护进程,而非你指定的DinD服务容器,进一步混淆了连接目标。 - 登录成功的假象:
docker login命令不需要连接Docker守护进程,它只是把认证信息写入本地的config.json文件,所以即使daemon没连上,登录也会返回成功;而docker info必须和daemon通信,才会暴露真实的连接问题。
具体解决方案
1. 统一CI任务的DinD镜像与rootless配置
修改你的CI文件,使用支持rootless的DinD服务镜像,并适配对应的环境变量:
build: image: docker:20.10 stage: build services: - docker:20.10-dind-rootless variables: # Rootless DinD默认使用TLS,端口为2376 DOCKER_HOST: tcp://docker:2376/ DOCKER_DRIVER: overlay2 # Rootless模式下必须指定证书目录 DOCKER_TLS_CERTDIR: "/certs" DOCKER_CERT_PATH: "/certs/client" script: - echo $CI_REGISTRY - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker info
2. 调整GitLab Runner配置,移除干扰项
修改Runner的config.toml,统一镜像版本并去掉不必要的宿主机sock挂载:
[[runners]] name = "Docker Runner" url = "https://gitlab.systems.co.uk/" token = "fgtgervsdasdsdds" executor = "docker" [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure] [runners.docker] tls_verify = false # 统一使用和CI任务一致的rootless DinD镜像 image = "docker:20.10-dind-rootless" privileged = true disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false # 移除宿主机docker.sock挂载,保留必要的缓存和证书目录 volumes = ["/cache", "/srv/gitlab-runner/config/certs:/etc/gitlab-runner/certs"] shm_size = 256m # 给DinD分配足够的共享内存,避免构建时内存不足
3. 验证宿主机依赖
Rootless DinD依赖slirp4netns工具做网络虚拟化,确保Runner所在的宿主机已经安装了这个工具(大多数现代Linux发行版已经预装,若没有则通过包管理器安装即可)。
内容的提问来源于stack exchange,提问作者mikita agrawal
相关产品推荐
相关产品推荐

