群晖Docker容器内Jenkins执行docker命令无法连接Docker daemon求解
问题根因
你遇到的报错本质是Jenkins容器内部无法和群晖宿主的Docker守护进程通信,默认Jenkins容器既没有挂载宿主的Docker socket文件,也没有对应的访问权限与Docker CLI工具。
操作步骤
1. 挂载宿主Docker socket到Jenkins容器
群晖Docker UI操作方式:
- 停止运行中的Jenkins容器,点击「编辑」进入容器配置页
- 切换到「卷」标签,点击「添加文件」,选择群晖本地路径
/var/run/docker.sock,容器内挂载路径填写/var/run/docker.sock,权限设置为「读写」 - 保存配置后重启容器
命令行启动操作方式:
如果是用docker命令启动Jenkins,启动参数增加挂载规则:
-v /var/run/docker.sock:/var/run/docker.sock
2. 容器内安装Docker CLI
Jenkins官方镜像默认没有内置docker命令行工具,你使用的是Debian 11基础镜像,进入Jenkins容器的终端执行以下命令安装:
apt update && apt install -y docker.io
如果需要避免容器重启后重复安装,可以将上述安装步骤加入Jenkins流水线的初始化环节,或者基于官方Jenkins镜像构建预安装Docker CLI的自定义镜像。
3. 配置Docker socket访问权限
完成前两步后仍大概率会有权限报错,因为容器内默认运行Jenkins服务的jenkins用户没有权限访问docker.sock文件,按以下步骤配置:
- 执行命令查询
docker.sock的所属组ID:
ls -n /var/run/docker.sock
输出结果第四列的数字即为组ID,常见默认值为999。
- 执行以下命令将
jenkins用户加入对应GID的docker组:
# 若docker组不存在则先创建,替换<查询到的GID>为上一步得到的数字 groupadd -g <查询到的GID> docker # 如果提示组已存在,执行命令修改现有docker组的GID:groupmod -g <查询到的GID> docker usermod -aG docker jenkins
- 重启Jenkins容器生效。
验证方法
重启后进入Jenkins容器终端,切换到jenkins用户执行docker ps,能正常输出容器列表即配置完成,后续流水线中即可正常执行docker build、docker push等操作。
群晖环境特殊说明
部分群晖系统重启后会重置docker.sock的默认权限,如果重启群晖后再次出现连接报错,可以将chmod 660 /var/run/docker.sock加入群晖的开机计划任务自动执行。
内容的提问来源于stack exchange,提问作者jjosjoahu
相关产品推荐
相关产品推荐

