jenkins在docker上访问主机docker

我有一个工作stream程如下发布webapps到我的开发服务器。 服务器有一个单一的docker主机,我使用docker-compose来pipe理容器。

  1. 将我的应用中的更改推送到私人gitlab(在docker中运行)。 该应用程序包括一个Dockerfile和docker-compose.yml
  2. Gitlab触发一个jenkins构build(jenkins也在docker中运行),它执行一些正常构build的东西(例如运行testing)
  3. Jenkins然后需要build立一个新的docker形象,并使用docker组成。

我有的问题是在第3步。我已经build立的方式,jenkins容器有权访问主docker,以便在构build脚本中运行任何docker命令基本上是在主机上运行相同。 这是使用下面的DockerFile 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中的典型构build脚本如下所示:

 docker-compose build docker-compose up 

这工作正常,但有两个问题:

  • 它真的感觉像一个黑客。 但是我发现的唯一的其他select是使用jenkins的docker插件,发布到registry,然后让主机知道它需要重新启动。 这是相当多的移动部件,并且docker-jenkins插件要求docker主机位于一个开放的端口上,我并不想公开这个端口。

  • jenkins DockerFile包含了groupadd -g 997 docker docker,它需要让jenkins用户访问docker。 但是,GID(997)是主机上的GID,因此不是便携式的。

我不确定我在找什么解决scheme。 我看不到任何实际的方法来解决这个问题,但是如果有一种方法允许在jenkins容器中运行docker命令,而不必在DockerFile中硬编码GID,那将会很好。 有没有人对此有任何build议?

我遇到了同样的问题。 由于GID问题,我最终给了Jenkins无密码的sudo权限。 我在这里写了更多关于这个: http : //container-solutions.com/2015/03/running-docker-in-jenkins-in-docker/

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

我之前的回答是更一般的,告诉你如何在运行时修改容器内的GID。 现在,巧合的是,来自我亲密的同事的人要求一个可以做docker开发的jenkins实例,所以我创build了这个实例:

 FROM bdruemen/jenkins-uid-from-volume RUN apt-get -yqq update && apt-get -yqq install docker.io && usermod -g docker jenkins VOLUME /var/run/docker.sock ENTRYPOINT groupmod -g $(stat -c "%g" /var/run/docker.sock) docker && usermod -u $(stat -c "%u" /var/jenkins_home) jenkins && gosu jenkins /bin/tini -- /usr/local/bin/jenkins.sh 

(父Dockerfile与我在我的回答中描述的相同: 在预构build的Docker容器(jenkins)中更改用户的uid )

要使用它,请同时安装jenkins_home和docker.sock。

 docker run -d /home/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock <IMAGE> 

容器中的jenkins进程将具有与挂载主机目录相同的UID。 假设主机上的docker组可以访问docker套接字,那么在容器中也会创build一个组,同样也称为docker,具有相同的GID。

请看看我刚发布的这个docker文件: https : //github.com/bdruemen/jenkins-docker-uid-from-volume/blob/master/gid-from-volume/Dockerfile

这里的GID是从一个已安装的卷(主目录)中提取的

 stat -c '%g' <VOLUME-PATH> 

然后,容器用户的组的GID被改变为相同的值

 groupmod -g <GID> 

这必须以root身份完成,但随后会删除root权限

 gosu <USERNAME> <COMMAND> 

一切都在进入点完成,所以真正的GID是未知的,直到你跑

 docker run -d -v <HOST-DIRECTORY>:<VOLUME-PATH> ... 

请注意,更改GID后,容器中可能还有其他文件不再可供该进程访问,因此您可能需要一个

 chgrp -R <GROUPNAME> <SOME-PATH> 

在gosu命令之前。

您也可以更改UID,在这里查看我的答案更改预构build的Docker容器(jenkins)中的用户uid ,也许您想更改两者以提高安全性。