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

Jenkins容器内执行docker ps失败,提示docker守护进程未运行?

解决Jenkins流水线中Docker无法连接daemon的问题

问题原因分析

出现unix:///var/run/docker.sock. Is the docker daemon running?错误,核心原因通常是以下几点:

  • 权限不足:Jenkins pod中的容器用户没有访问宿主节点/var/run/docker.sock的权限,该文件默认属于root:docker组,权限为rw-rw----
  • 镜像权限映射缺失:官方docker镜像仅包含客户端,未与宿主节点的docker用户组做权限映射
  • 宿主daemon未运行:Jenkins所在的Kubernetes节点上Docker daemon未正常启动

解决方案

1. 先验证宿主节点基础状态

登录Jenkins运行的K8s节点,执行以下命令确认环境正常:

# 检查docker daemon运行状态
systemctl status docker
# 确认sock文件权限与所属组
ls -l /var/run/docker.sock
# 查看docker组ID(后续配置需要)
id docker

如果daemon未运行,先启动它;如果sock权限不是rw-rw----,可临时执行chmod 666 /var/run/docker.sock测试(生产环境建议通过组权限解决)。

2. 修改Jenkinsfile配置

调整podTemplate中的容器配置,补充权限映射与环境变量:

podTemplate(serviceAccount: 'jenkins', containers: [ 
    containerTemplate(
      name: 'docker', 
      image: 'docker:latest', 
      resourceRequestCpu: '100m',
      resourceLimitCpu: '300m',
      resourceRequestMemory: '300Mi',
      resourceLimitMemory: '500Mi',
      command: 'cat', 
      privileged: true,
      ttyEnabled: true,
      # 指定docker客户端连接的daemon地址
      envVars: [
          envVar(key: 'DOCKER_HOST', value: 'unix:///var/run/docker.sock')
      ],
      # 映射宿主docker组ID到容器(替换为你节点上的docker组ID,比如999)
      args: ['-c', 'groupadd -g 999 docker && usermod -aG docker root && cat']
    )
  ],

  volumes: [
    hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
  ]
  ) {
    node(POD_LABEL) {
        stage('Check running containers') {
            container('docker') {  
                sh 'hostname'
                sh 'hostname -i' 
                sh 'docker --version'
                # 先检查sock文件权限,方便排查
                sh 'ls -l /var/run/docker.sock'
                sh 'docker ps'
            }
        }
    }
}

关键调整说明

  • 添加DOCKER_HOST环境变量:明确指定docker客户端连接的daemon地址,避免客户端自动寻址出错
  • 映射docker组ID:通过groupadd和usermod让容器内的root用户加入宿主的docker组,从根本解决权限问题
  • 添加权限检查步骤:在docker ps前先查看sock文件权限,快速定位权限类问题

3. 验证ServiceAccount权限

确保Jenkins使用的jenkins ServiceAccount拥有足够的节点访问权限,执行以下命令检查:

kubectl describe sa jenkins -n <你的Jenkins命名空间>

如果权限不足,需要为该ServiceAccount绑定包含节点资源访问权限的ClusterRole。

内容的提问来源于stack exchange,提问作者slim_wn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:11:02