GitLab Runner DinD报错:无法创建/var/run/docker.sock(设备或资源忙)
问题现象
流水线突然报错:
failed to load listeners: can't create unix socket /var/run/docker.sock: device or resource busy
同时日志提示:
could not change group /var/run/docker.sock to docker: group docker not found
已尝试的无效操作
- 重启GitLab Runner虚拟机
- 检查宿主机docker组是否创建且gitlab-runner用户在组内
- 更新GitLab Runner版本以匹配GitLab服务器
- 重启宿主机Docker服务
- 检查/var/run/docker.sock是否被锁定
- 移除gitlab-ci.yml中的DinD配置
- 排查GitLab Runner日志,定位到问题疑似出在自定义Docker镜像中
配置示例(参考)
config.toml(Runner配置)
[[runners]] name = "DinD Runner" url = "https://gitlab.example.com/" token = "xxxxxx" executor = "docker" [runners.docker] tls_verify = false image = "your-custom-build-image:latest" privileged = true volumes = ["/cache"] shm_size = 0 [runners.cache] [runners.cache.s3] [runners.cache.gcs]
gitlab-ci.yml(流水线配置)
stages: - build build: stage: build services: - name: docker:dind command: ["--group=docker"] variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_TLS_VERIFY: 1 DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client" script: - docker version - # 你的构建命令
解决方案
1. 修复自定义镜像的docker组缺失问题
在自定义镜像的Dockerfile中添加创建docker组并将gitlab-runner用户加入组的步骤:
# 匹配宿主机docker组的GID(执行`cat /etc/group | grep docker`查看宿主机GID) RUN groupadd -g 999 docker # 将gitlab-runner用户加入docker组 RUN usermod -aG docker gitlab-runner
构建并推送更新后的镜像到仓库,更新流水线使用的镜像版本。
2. 解决socket资源占用冲突
这个错误通常是因为宿主机的docker.sock被挂载到DinD容器内,同时容器内又启动了docker:dind服务,导致两个进程争夺同一个socket文件。
如果使用真正的DinD模式(容器内独立运行Docker服务):
移除config.toml中volumes里的/var/run/docker.sock:/var/run/docker.sock挂载项,同时在gitlab-ci.yml中使用TCP连接Docker服务(如上面的配置示例)。如果需要复用宿主机Docker服务:
移除gitlab-ci.yml中的docker:dind服务配置,保留config.toml中的socket挂载,确保宿主机的gitlab-runner用户已加入docker组,且socket权限正确(执行chmod 666 /var/run/docker.sock临时测试,长期建议通过组权限控制)。
3. 排查自定义镜像内的Docker服务残留
检查自定义镜像的启动脚本,确保没有预先启动Docker服务的逻辑,避免和docker:dind服务冲突。
内容的提问来源于stack exchange,提问作者am.cosomo

