jenkins在docker上访问主机docker
我有一个工作stream程如下发布webapps到我的开发服务器。 服务器有一个单一的docker主机,我使用docker-compose来pipe理容器。
- 将我的应用中的更改推送到私人gitlab(在docker中运行)。 该应用程序包括一个Dockerfile和docker-compose.yml
- Gitlab触发一个jenkins构build(jenkins也在docker中运行),它执行一些正常构build的东西(例如运行testing)
- 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 ,也许您想更改两者以提高安全性。