You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:04:56