一尘不染

詹金斯在Docker中可以访问主机Docker

docker

我有以下工作流程,用于将Web应用发布到我的开发服务器。该服务器只有一个docker主机,我正在使用docker-compose来管理容器。

  1. 将我的应用程序中的更改推送到私有gitlab(在docker中运行)。该应用程序包括一个Dockerfile和docker-compose.yml
  2. Gitlab触发了一个jenkins构建(jenkins也正在docker中运行),它会执行一些常规的构建工作(例如,运行测试)
  3. 然后,Jenkins需要构建一个新的Docker映像并使用docker-compose进行部署。

我遇到的问题是在步骤3中。通过设置方式,jenkins容器可以访问主机泊坞窗,因此docker在构建脚本中运行任何命令与在主机上运行该命令本质上相同。DockerFile对于詹金斯,使用以下命令完成此操作:

FROM jenkins
USER root

# Give jenkins access to docker
RUN groupadd -g 997 docker
RUN gpasswd -a jenkins docker

# Install docker-compose
RUN curl -L https://github.com/docker/compose/releases/download/1.2.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
RUN chmod +x /usr/local/bin/docker-compose

USER jenkins

并将以下卷映射到jenkins容器:

-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/bin/docker:/usr/bin/docker

jenkins中的典型构建脚本如下所示:

docker-compose build
docker-compose up

可以,但是有两个问题:

  • 感觉真像是在砍。但是我发现的唯一其他选择是将docker插件用于jenkins,发布到注册表,然后通过某种方式让主机知道需要重启。这是很多可移动的部分,并且docker-jenkins插件要求docker主机位于开放端口上,我真的不想透露它。

  • jenkins DockerFile包含groupadd -g 997 docker需要它才能使jenkins用户访问docker。但是,GID(997)是主机上的GID,因此不可移植。

我不确定我要寻找什么解决方案。我看不到任何实际的方法可以解决该问题,但是如果有一种方法可以允许在jenkins容器内运行docker命令而不必在DockerFile中对GID进行硬编码,那就太好了。有人对此有任何建议吗?


阅读 210

收藏
2020-06-17

共1个答案

一尘不染

我遇到了同样的问题。由于GID问题,我最终给了Jenkins无密码的sudo特权。我在这里写了更多有关此的内容:https : //blog.container-
solutions.com/running-docker-in-jenkins-in-docker

这实际上并没有影响安全性,因为拥有docker特权实际上等同于sudo权限。

2020-06-17