使用Jenkins Kubernetes插件执行docker build时Docker守护进程连接失败
问题描述
执行docker build时出现错误:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
已尝试挂载/var/run/docker.sock、设置runAsUser: root以root权限运行,但问题仍未解决。对应的Jenkins as Code Pod模板配置如下:
Jenkins:config: chart: jenkins namespace: default repo: https://charts.jenkins.io values: agent: enabled: true podTemplates: jenkins-slave-pod: | - name: jenkins-xxx-pod label: ecs-slave serviceAccount: jenkins-xxx-prod containers: - name: main image: '805xxxx.dkr.ecr.us-west-2.amazonaws.com/slave:ecs-xxxx-node_master-3' command: "sleep" args: "30d" privileged: true runAsUser: root volumes: - hostPathVolume: hostPath: "/var/run/docker.sock" mountPath: "/var/run/docker.sock"
排查与解决步骤
检查宿主机Docker daemon状态
登录Agent Pod所在的Kubernetes节点,执行systemctl status docker确认Docker服务是否正常运行。若服务未启动,执行systemctl start docker并设置开机自启systemctl enable docker。验证docker.sock权限映射
进入运行中的Agent Pod,执行ls -l /var/run/docker.sock查看文件权限。宿主机的docker.sock通常属于docker用户组(GID一般为999),即使Pod以root运行,容器内若无对应GID的用户组也无法访问。解决方式:- 在容器内添加GID为999的用户组:
groupadd -g 999 docker - 将root用户加入该组:
usermod -aG docker root
可将这两步加入镜像构建脚本,或在Pod启动命令中执行。
- 在容器内添加GID为999的用户组:
确认hostPath挂载的正确性
检查Kubernetes节点上/var/run/docker.sock是否存在、路径是否正确。部分环境中Docker daemon可能使用不同的socket路径(如/run/docker.sock),可在节点上执行docker info | grep "Docker Root Dir"或查看Docker配置文件确认socket路径。检查SELinux限制(若节点启用SELinux)
若节点开启SELinux,可能阻止容器访问宿主机的docker.sock。临时关闭SELinux测试:setenforce 0,若问题解决,需添加SELinux规则允许容器访问该socket,或在Pod的securityContext中设置seLinuxOptions: { type: "spc_t" }(根据实际环境调整)。完善Agent容器的securityContext配置
确保容器级权限配置完整,避免Pod级设置覆盖。可在容器配置中添加:containers: - name: main # ... 其他原有配置 securityContext: privileged: true runAsUser: 0 allowPrivilegeEscalation: true确认镜像包含兼容的Docker客户端
检查Agent镜像是否已安装Docker客户端,且版本与宿主机Docker daemon兼容。进入Pod执行docker version,若命令不存在,需在镜像中安装对应版本的Docker客户端。
内容的提问来源于stack exchange,提问作者EilonA

