Docker部署的Jenkins打包后端项目运行报错:no DOCKER_HOST environment variable, no read/writable '/var/run/docker.sock' or '//./pipe/docker_engine' and no external provider like Docker machine(容器内却能执行成功)
一:错误信息
报错信息如下:

根本原因是 Jenkins容器未正确挂载宿主机的Docker守护进程,导致插件无法通过默认路径(/var/run/docker.sock)与Docker通信 或 权限问题。
二:解决方案一
1、挂载Docker Socket 并以 root 用户运行 Jenkins 容器
适用场景:Jenkins容器需要直接调用宿主机的Docker引擎(DinD模式)。
操作步骤:
1、重新启动Jenkins容器,挂载宿主机Docker套接字和二进制
文件:
docker run -d \
--name jenkins \
-p 8080:8080 -p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \ # 挂载Docker套接字
-v $(which docker):/usr/bin/docker \ # 挂载Docker命令行工具
-v jenkins_home:/var/jenkins_home \
-u root \ # 以root用户运行(避免权限问题)注意:长期使用 root 用户存在安全风险,建议仅用于调试。
jenkins/jenkins:lts
关键点:-u root 确保容器内用户有权限访问docker.sock(生产环境建议改用jenkins用户+组权限配置)。
备注:如果容器已经添加了很多插件不想删除重新启动,则修改权限或添加用户组,如下方案
三:解决方案二
验证权限(可选): 进入容器检查docker.sock的权限:
docker exec -it 容器名称 ls -l /var/run/docker.sock
查询如下:

可以看出关键问题是权限不足导致
权限不足:s--------T 表示只有文件所有者(jenkins)有读写权限,但 jenkins 用户可能未正确加入 docker 组(GID 994)。
T标志位:T(粘滞位)通常不影响访问,但结合权限限制会加剧问题。
操作如下:
1. 修改 docker.sock 权限(临时方案)
# 在宿主机执行(非容器内): sudo chmod 666 /var/run/docker.sock # 开放全局读写权限(不安全,仅调试用)
注意:此方法会降低安全性,仅用于临时验证问题。验证后需恢复权限并采用以下安全方案。
2、 将 jenkins 用户加入 docker 组(推荐)
步骤 1:确认宿主机 docker 组信息
# 在宿主机执行:
getent group docker
输出示例:
docker:x:994:user1,user2 # GID为994,当前成员为user1,user2
步骤 2:在 Jenkins 容器内同步 docker 组
# 进入Jenkins容器: docker exec -it jenkins3 /bin/bash # 在容器内执行: groupadd -g 994 docker # 创建与宿主机同GID的docker组 usermod -aG docker jenkins # 将jenkins用户加入docker组 exit # 重启容器使配置生效: docker restart jenkins3
步骤 3:验证权限
docker exec -it jenkins3 ls -l /var/run/docker.sock
预期输出:
srw-rw----. 1 jenkins docker 0 Oct 23 11:23 /var/run/docker.sock
若成功,jenkins 用户应能正常访问 Docker。
再次尝试,打包成功。。。

本文来自博客园,作者:攻城狮-tester,转载请注明原文链接:https://www.cnblogs.com/zcjbky/p/19160466

浙公网安备 33010602011771号