Jenkins运行于Docker容器中时,如何在宿主机启动Docker构建容器?
让Jenkins容器调用宿主机Docker执行构建的方案
这个需求在Docker化Jenkins的场景里特别常见,核心思路就是让Jenkins容器直接复用宿主机的Docker环境,完全不需要嵌套容器。下面是具体的实现步骤:
1. 启动Jenkins时挂载关键资源
启动Jenkins容器时,需要挂载两个核心组件,让容器能直接和宿主机Docker通信:
- 宿主机的Docker套接字:
/var/run/docker.sock,这是Docker守护进程的通信入口 - 宿主机的Docker客户端二进制文件:
/usr/bin/docker,给Jenkins容器提供执行Docker命令的工具
执行以下命令启动(或重新启动)Jenkins容器:
docker run -d \ --name jenkins \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ jenkins/jenkins:lts
2. 解决权限问题(关键!)
Docker套接字默认属于宿主机的docker用户组(GID通常是999),Jenkins容器内的jenkins用户需要加入这个组才能有权限操作。
方式一:启动容器时直接指定(推荐)
在启动命令里加入--group-add参数,自动获取宿主机docker组的GID并添加:
docker run -d \ --name jenkins \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ --group-add $(getent group docker | cut -d: -f3) \ jenkins/jenkins:lts
小提示:
getent group docker | cut -d: -f3会自动读取宿主机docker组的GID,避免手动硬编码出错。
方式二:给已运行的容器补权限
如果Jenkins已经在运行,先进入容器:
docker exec -it jenkins bash
然后把jenkins用户加入docker组(这里假设GID是999,你可以用getent group docker在宿主机确认):
usermod -aG docker jenkins
最后重启Jenkins容器生效:
docker restart jenkins
3. 验证配置是否生效
进入Jenkins容器执行docker ps,如果能列出宿主机上的所有容器,就说明配置成功了:
docker exec jenkins docker ps
之后你在Jenkins构建任务里执行的docker build、docker run等命令,都会直接在宿主机上运行,完全不会在Jenkins容器内部启动嵌套容器。
一些注意事项
- 尽量保证宿主机Docker版本和容器内挂载的Docker客户端版本一致,避免兼容性问题
- 这种配置给了Jenkins容器很高的权限(能直接操作宿主机Docker),要注意Jenkins任务的安全性,避免执行恶意命令
- 你的宿主机是AWS Xenial 16.04,Docker的安装路径和组ID都是标准配置,上面的命令应该可以直接复用
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

