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
相关产品推荐
相关产品推荐

