如何在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上, gid
是1001
。 那么我的整个设置将无法正常工作。 所以现在我的问题:
有没有办法让你的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
,以便能够查看主机信息。