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

GitLab Runner DinD报错:无法创建/var/run/docker.sock(设备或资源忙)

GitLab Runner DinD模式:socket创建失败与docker组不存在问题

问题现象

流水线突然报错:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:47:04