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