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了
参考资料:
[1] https://blog.csdn.net/catoop/article/details/91042007
[2] https://www.cnblogs.com/informatics/p/8276172.html
[3] https://www.cnblogs.com/sparkdev/p/9614164.html