在Jenkins Docker代理中运行Docker容器遇权限问题求助
我来帮你搞定这两个问题,先理清楚前因后果,再给你具体的解决方案:
第一个问题:docker: invalid reference format 错误
你最初用了$(which docker)在agent的args里,这个写法是shell的命令替换,但Jenkins在解析docker agent的参数时,不会执行shell解析,直接把整个字符串传给docker run,所以导致了镜像引用格式错误。你换成绝对路径/usr/bin/docker是完全正确的,这步已经解决了第一个问题。
第二个问题:Error: connect EACCES /var/run/docker.sock 权限问题
这个错误的核心是容器内运行Jenkins Agent的用户没有访问/var/run/docker.sock的权限。宿主机器上的docker.sock默认属于docker用户组(GID通常是999,但不同机器可能有差异),而容器内的Jenkins用户不在这个组里,所以被拒绝访问。
下面是几种靠谱的解决方案,按推荐程度排序:
方案1:启动容器时添加用户到宿主的docker组
这是最灵活且安全的方法:
- 先在你的Jenkins宿主机器上执行这个命令,获取docker组的GID:
比如得到的结果是getent group docker | cut -d: -f3999(记下来这个数字)。 - 修改你的Jenkins流水线配置,在
args里添加--group-add [你的GID],替换成上面得到的数字:
这样容器内的Jenkins用户就会被临时加入对应GID的组,拥有访问pipeline { agent { docker { image 'danthedev/dtd-docker-node' args '-p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --group-add 999' } } environment { CI = 'true' } stages { stage('Build') { steps { sh 'yarn install' } } stage('Test') { environment { NODE_ENV = 'test' } steps { sh 'yarn test' } } } }docker.sock的权限。
方案2:自定义镜像时预先配置权限(适合长期维护镜像)
如果你自己维护danthedev/dtd-docker-node这个镜像,可以修改Dockerfile,把Jenkins用户加入docker组:
# 假设基础镜像已经创建了jenkins用户 # 创建docker组(如果不存在),GID和宿主保持一致 RUN groupadd -g 999 docker || true # 将jenkins用户加入docker组 RUN usermod -aG docker jenkins
注意:如果宿主的docker组GID不是999,这个方法会失效,所以方案1更通用。
方案3:临时放宽docker.sock权限(仅测试用,不推荐生产)
如果只是快速测试,可以在宿主机器上执行这个命令,让所有用户都能访问docker.sock:
chmod 666 /var/run/docker.sock
但这种做法会带来安全风险,生产环境绝对不要用。
最后补充一句:你现在用的是**Docker-out-of-Docker(DooD)**模式(通过挂载宿主的docker.sock来复用宿主的Docker引擎),比真正的Docker-in-Docker(DinD)更轻量,也更适合你的测试场景,只要权限配置正确就能正常工作。
内容的提问来源于stack exchange,提问作者Daniel Khoroshko

