Jenkins容器内执行Docker命令权限不足,求解决方案
环境信息
- Jenkins镜像:
jenkins/jenkins:2.361.1-lts-jdk11 - 容器启动命令:
docker run -p 8080:8080 -p 50000:50000 -d -v jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --privileged jenkins/jenkins:2.361.1-lts-jdk11
当前进展
已完成代码拉取、项目构建步骤,现需通过Jenkins构建Docker镜像并推送到Docker Hub。
相关配置文件
Jenkinsfile
pipeline{ agent any tools{ maven 'Maven-3.8.6' } stages{ stage('checkout'){ steps{ echo 'checkout the application' git 'https://github.com/hvalola/demo_jenkins' } } stage('build'){ steps{ echo 'building the application' sh 'mvn package' } } stage('test'){ steps{ echo 'testing the application' } } stage('deploy'){ steps{ echo 'deploying the application' } } stage('Build docker image'){ steps{ script{ def dockerHome = tool 'demo-docker' env.PATH = "${dockerHome}/bin:${env.PATH}" sh 'docker build -t pubudurana/demo_jenkins .' } } } } }
Dockerfile
FROM openjdk:11 EXPOSE 8090 ADD target/demo_jenkins.jar demo_jenkins.jar ENTRYPOINT ["java","-jar","/devops-integration.jar"]
错误信息
docker build -t pubudurana/demo_jenkins .
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.29/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=pubudurana%2Fdemo_jenkins&target=&ulimits=null: dial unix /var/run/docker.sock: connect: permission denied
解决方案
方法1:调整Jenkins用户权限(推荐)
Jenkins默认以jenkins用户运行,该用户无宿主机docker组权限,需将其加入对应组:
- 查看宿主机docker组GID:
cat /etc/group | grep docker
输出示例:docker:x:999:,其中999为GID。
2. 进入Jenkins容器:
docker exec -it <Jenkins容器ID> /bin/bash
- 将jenkins用户加入对应组:
usermod -aG 999 jenkins
- 重启Jenkins容器:
docker restart <Jenkins容器ID>
方法2:临时修改socket权限(仅测试环境)
在Jenkinsfile的docker构建步骤前临时放开socket权限:
stage('Build docker image'){ steps{ script{ def dockerHome = tool 'demo-docker' env.PATH = "${dockerHome}/bin:${env.PATH}" sh 'chmod 666 /var/run/docker.sock' sh 'docker build -t pubudurana/demo_jenkins .' } } }
注意:此方法会降低系统安全性,禁止生产环境使用。
方法3:使用Docker-in-Docker模式(生产环境可选)
让Jenkins容器内部运行独立Docker daemon,避免共享宿主机socket:
修改启动命令:
docker run -p 8080:8080 -p 50000:50000 -d \ -v jenkins_home:/var/jenkins_home \ --privileged \ jenkins/jenkins:2.361.1-lts-jdk11 \ /usr/local/bin/jenkins.sh --enable-future-java
随后在Jenkins中配置Docker插件指向容器内部的daemon地址即可。
额外修复:Dockerfile路径错误
你的Dockerfile中ENTRYPOINT引用的/devops-integration.jar与ADD的demo_jenkins.jar不匹配,需修正:
FROM openjdk:11 EXPOSE 8090 ADD target/demo_jenkins.jar demo_jenkins.jar ENTRYPOINT ["java","-jar","/demo_jenkins.jar"]
内容的提问来源于stack exchange,提问作者Pubudu Ranathunga

