docker搭建jenkins环境执行宿主机的docker时会出现permission denied的情况

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
…………………………………………………………
dial unix /var/run/docker.sock: connect: permission denied

       网上[1]的解决方法是在容器所在的宿主机上直接给 docker.sock 777权限,命令 chmod 777 docker.sock,但是这样能使所有用户都能访问docker,降低了系统安全性,所以本文从用户组[2]方面入手解决这一问题。

  根据[3]所示,容器在内外访问的uid和gid是相同的,也就是容器在访问外部挂载文件的用户和组的唯一标识是完全一样的,如下图所示,根据[4]所示的挂载情况(-v /var/run/docker.sock:/var/run/docker.sock ),我们来找到属组的id。

宿主机docker文件属组情况:

宿主机属组id:

jenkins容器内的文件情况:

从图中可知,docker.sock的属组是998,由于容器内部没有组id为998的组,所以显示998,而jenkins容器内的默认用户是jenkins用户,所以我们需要创建组id为998的组,把jenkins用户添加到id为998的组,就能满足jenkins容器访问容器外的docker。

首先以root权限进去jenkins容器:

docker exec -it -u root jenkins bash

 然后创建组id为998的组:

groupadd -g 998 docker

这时, jenkins容器内的文件情况:

然后把jenkins用户加入到docker组中[5]:

退出容器,以jenkins用户进入容器,输入docker version,如果没有权限的话不能看到服务端:

重启jenkins容器,就能在jenkins页面上使用容器外的docker了

为了更快的运行jenkins,本人对上述操作进行整理,步骤如下(宿主机):

1、根据组名查询属组id[6]

gid=`grep 'docker' /etc/group | cut -d ':' -f 3` 

2、对Jenkins容器进行配置[7]

docker run -d --name tempjenkins -u root -v $宿主机jenkins挂载目录:/var/jenkins_home \ 
jenkins/jenkins:2.249.1-alpine bash -c "chmod -R 777 /tmp; chown -R jenkins \ 
/var/jenkins_home;chgrp -R jenkins /var/jenkins_home; chmod -R 770 /var/jenkins_home; \
echo 'docker:x:$gid:jenkins' >> /etc/group"

3、提交镜像

docker commit tempjenkins jenkins/jenkins:2.249.1-alpine

4、运行镜像

docker run -d -p 16375:8080 -p 50000:50000 -e LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu \
           -v $宿主机jenkins挂载目录:/var/jenkins_home \
           -v /var/run/docker.sock:/var/run/docker.sock \
           -v /usr/bin/docker:/usr/bin/docker -v /etc/localtime:/etc/localtime \
           -v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \  
          --name jenkins jenkins/jenkins:2.249.1-alpine bash /usr/local/bin/jenkins.sh

适用于docker 18及以上版本

如果是docker desktop,可能需要添加挂载

-v /usr/bin/com.docker.cli:/usr/bin/com.docker.cli

参考资料:

[1] 在docker容器中调用和执行宿主机的docker_docker访问宿主机文件-CSDN博客

[2] https://www.cnblogs.com/informatics/p/8276172.html

[3] https://www.cnblogs.com/sparkdev/p/9614164.html

[4] https://www.cnblogs.com/leolztang/p/6934694.html

[5] https://www.cnblogs.com/codeaaa/p/9041533.html

[6] https://www.cnblogs.com/red-code/p/5424327.html

[7] https://www.cnblogs.com/fengjian2016/p/9970778.html

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐