背景:不想在Jenkins 内部安装Docker,想直接使用Jenkins服务所在的系统安装的docker
当你在 Jenkins 中执行 docker
命令时,实际上是通过 Docker 客户端与 Docker 守护进程进行通信。Docker 客户端和守护进程之间的通信是通过一个名为 /var/run/docker.sock
的 Unix socket 进行的。默认情况下,只有 root
用户和属于 docker
组的用户才有权限访问这个 socket 文件。
当 Jenkins 尝试运行 docker build
或其他 docker
命令时,它需要通过 /var/run/docker.sock
与 Docker 守护进程交互。如果 Jenkins 运行的用户(通常是 jenkins
)没有足够的权限访问这个 socket 文件,就会出现类似下面的错误
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
javascript
cd /var/run/
ls -l
# 只有 root 和 docker 组的成员可以访问/var/run/docker.sock
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
# jenkins 用户添加到 docker 组
sudo usermod -aG docker jenkins
# 期望输出:jenkins : jenkins docker
groups jenkins

javascript
# 检查 Jenkins 用户的 Shell 设置 非交互式(bin/false)
grep jenkins /etc/passwd
# 将Jenkins 用户的 shell 修改为 /bin/bash 或其他合适的交互式 shell
sudo usermod -s /bin/bash jenkins
# 检查
grep jenkins /etc/passwd

javascript
#将 Jenkins 用户添加到 Docker 组
sudo usermod -aG docker jenkins
sudo su - jenkins
# 期望输出 jenkins 如果不生效,尝试重启系统 reboot
whoami
# 尝试jenkins能否使用外部docker
docker ps

目前你看到的 -bash-4.2$
是因为 Jenkins 用户主目录中没有 .bashrc
、.bash_profile
等配置文件。你可以通过以下命令来修复这个问题:
javascript
exit
cp /etc/skel/.bash* /var/lib/jenkins/
chown -R jenkins:jenkins /var/lib/jenkins/.bash*
# 检查
sudo su - jenkins
