登顶者中的詹金斯可以访问主机泊坞窗

时间:2015-05-06 09:17:10

标签: jenkins docker

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

  1. 将我的应用中的更改推送到私有gitlab(在docker中运行)。该应用程序包括Dockerfile和docker-compose.yml
  2. Gitlab触发jenkins构建(jenkins也在docker中运行),它执行一些正常的构建(例如运行测试)
  3. 然后Jenkins需要构建一个新的docker镜像并使用docker-compose进行部署。
  4. 我遇到的问题是在第3步。我设置它的方式,jenkins容器可以访问主机docker,以便在构建脚本中运行任何docker命令与运行它基本相同在主持人。这是使用以下DockerFile为jenkins完成的:

    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
    

    这没关系,但有两个问题:

    • 这真的感觉像是黑客。但我发现的唯一其他选择是使用jenkins的docker插件,发布到注册表,然后让某些方法让主机知道它需要重新启动。这是一个非常多的移动部件,docker-jenkins插件要求docker主机位于一个开放的端口上,我真的不想暴露它。

    • jenkins DockerFile包含groupadd -g 997 docker,这是让jenkins用户访问docker所必需的。但是,GID(997)是主机上的GID,因此不可移植。

    我不确定我正在寻找什么样的解决方案。我无法找到解决这种方法的任何实用方法,但如果有一种方法允许在jenkins容器内运行docker命令而不必在DockerFile中硬编码GID,那就太好了。有没有人对此有任何建议?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

我以前的回答更通用,告诉你如何在运行时修改容器内的GID。现在,巧合的是,我的亲密同事的某个人要求一个可以进行码头开发的jenkins实例,所以我创建了这个:

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与我在答案中描述的相同:Changing the user's uid in a pre-build docker container (jenkins)

要使用它,请同时安装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 socket,则在容器中创建一个组,也称为docker,具有相同的GID。

答案 2 :(得分:2)

请查看我刚刚发布的这个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>

所有内容都在ENTRYPOINT中完成,因此在您运行

之前,真正的GID是未知的
docker run -d -v <HOST-DIRECTORY>:<VOLUME-PATH> ...

请注意,更改GID后,流程中可能无法再访问容器中的其他文件,因此您可能需要

chgrp -R <GROUPNAME> <SOME-PATH>    
在gosu命令之前

您也可以更改UID,在此处查看我的答案Changing the user's uid in a pre-build docker container (jenkins) 也许你想改变它们以提高安全性。