如何在Dockerfile中获取主机上的组的GID

我正在build造一个docker服务器的图像,将服务于詹姆斯的奴隶。 该图像需要Java和SSHD。 目前我有一个docker集装箱,可以作为jenkins奴隶。 我的奴隶里面的用户是我在dockerfile里创build的用户jenkins。

FROM java:8-jdk ENV JENKINS_HOME /var/jenkins_home ARG user=jenkins ARG group=jenkins ARG uid=999 ARG gid=999 RUN groupadd -g ${gid} ${group} \ && useradd -d "$JENKINS_HOME" -u ${uid} -g ${gid} -m -s /bin/bash ${user} VOLUME /var/jenkins_home WORKDIR /var/jenkins_home 

现在我想让我的jenkins奴隶能够build立docker图像。 所以我的jenkins需要运行的每个docker命令都会在这个slave上执行。 为此,我不得不把我的dockersockets装到我的奴隶容器上。

我用docker-compose启动我的slave-container。 在这里,你看我如何开始我的奴隶:

 jenkins-slave: build: ./slave image: jenkins-slave:1.0 container_name: jenkins-slave volumes: - slave-volume:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker ... 

所以现在我不得不改变我的Dockerfile,因为默认情况下只有root用户才能使用docker。 我想我的jenkins用户可以执行docker命令,所以我改变了我的Dockerfile,并添加:

 RUN groupadd -g 983 docker \ && usermod -a -G docker jenkins 

现在我可以执行ssh jenkins@172.19.0.2并与jenkins用户执行ssh jenkins@172.19.0.2命令。 但这只是因为我的主机上的docker组的gid也是983 (centos7)。 但在我的Ubuntu上, gid1001 。 那么我的整个设置将无法正常工作。 所以现在我的问题:

有没有办法让你的dockerfile中的主机的gid

Dockerfile在构build主机上的构build时使用。 最终将构build映像作为容器运行的主机在此阶段是未知的,因此有关主机的信息不容易查找。 通常所有主机都使用相同的映像,因此在构build时configurationGID也很困难。

BMitchbuild议在整个组织中使用一致的GID(和UID)是最好的解决scheme。 这通常是一个好主意,不仅是docker工人。 它有助于集中用户pipe理,NFS喜欢它,LDAP更容易移动到。

如果一致的GID太难设置,那么有几种方法可以解决这个问题。

多个图像

如果您的GID数量有限,您可以从jenkins基本图像创build多个图像。

标签: my/jenkins-centos

 FROM my/jenkins RUN groupadd -g 983 docker \ && usermod -a -G docker jenkins 

标签: my/jenkins-ubuntu

 FROM my/jenkins RUN groupadd -g 1001 docker \ && usermod -a -G docker jenkins 

然后select在哪个主机上运行的映像。

运行

如果您必须支持可变的docker GID,那么groupadd逻辑可以在启动脚本的容器启动时运行,然后启动组设置,然后启动Jenkins。 您可能需要在容器中的某个位置挂载/etc/group ,以便能够查看主机信息。