docker启动jenkins,内部访问docker命令报错
一、现象
使用docker启动jenkins,并将docker命令映射到jenkins中去。
在jenkins容器中使用docker命令时,报错:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.29/images/json: dial unix /var/run/docker.sock: connect: permission denied
二、解决方法
这是由于在jenkins镜像中使用的用户是jenkins,而docker.sock文件的格式为root:docker。
网上查到有三种解决方法:
1.将jenkins用户加入到docker组中(此种方法未生效)
gpasswd -a jenkins docker(将jenkins用户加入到docker组中)
cat /etc/group | grep ^docker(查看是否加入成功)
serivce docker restart(重启docker服务)
此种方法未生效,主要是因为在jenkins镜像中并没有docker分组,映射进去的文件显示分组为999,不知是否还有其他解决方法。
2.重新打包jenkins镜像,将jenkins分组修改进去
FROM jenkins:alpine
USER root
RUN curl -O https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz \
&& tar zxvf docker-latest.tgz \
&& cp docker/docker /usr/local/bin/ \
&& rm -rf docker docker-latest.tgz
ARG DOCKER_GID=999
USER jenkins:${DOCKER_GID}
然后重新docker build生成新的镜像,这种方法固然可以使用,但还是比较麻烦的。
3.修改docker.sock文件的权限'
chown jenkins docker.sock
chown jenkins:jenkins docker.sock
综上,第三种方法简单省力,就是每次重启docker服务时,要执行一次命令。