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

Jenkins 如何在Dockerfile中获取主机上组的GID,jenkins,docker,docker-compose,dockerfile,Jenkins,Docker,Docker Compose,Dockerfile,我正在建立一个码头工人的形象,这将服务于艾尔斯·詹金斯的奴隶。 映像需要Java和SSHD。 目前,我有一个码头集装箱,可以作为詹金斯奴隶。我的从属文件中的用户是我在dockerfile中创建的用户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} \

我正在建立一个码头工人的形象,这将服务于艾尔斯·詹金斯的奴隶。 映像需要Java和SSHD。 目前,我有一个码头集装箱,可以作为詹金斯奴隶。我的从属文件中的用户是我在dockerfile中创建的用户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
现在,我希望我的詹金斯奴隶能够创建docker图像。因此,我的詹金斯需要运行的每个docker命令都将在这个从机上执行。因此,我必须将我的docker插座安装到我的从属容器上

我用docker compose启动从属容器。在这里,您可以看到我如何启动我的奴隶:

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
      ...
所以现在我必须更改docker文件,因为默认情况下只有root用户才能使用docker。我希望我的jenkins用户可以执行docker命令,因此我更改了Dockerfile并添加:

RUN groupadd -g 983 docker \
&& usermod -a -G docker jenkins
现在我可以执行
ssh了jenkins@172.19.0.2
并与jenkins用户一起执行docker命令。 但这仅仅是因为主机上docker组的
gid
也是
983
(centos7)。但是在我的Ubuntu上,
gid
1001
。因此,我的整个设置将无法工作。现在我的问题是:


是否有办法在dockerfile中获取主机的
gid

在生成主机时使用
dockerfile
。在此阶段,最终将生成的映像作为容器运行的主机是未知的,因此不容易查找有关主机的信息。相同的映像通常会在所有主机上使用,因此在构建时配置GID也很困难

BMitch建议在整个组织中使用一致的GID(和UID)是最佳解决方案。这通常是一个好主意,不仅仅是对docker来说。它有助于集中化的用户管理,NFS喜欢它,LDAP更易于移动

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

多图像 如果要支持的GID数量有限,则可以从jenkins基础映像创建多个映像

标签:
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
然后选择在哪个主机上运行哪个映像

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

最简单的解决方案是在整个组织内对gid进行标准化,在任何系统上安装引擎之前创建gid。也许这是唯一的解决方案。