我正在为docker jenkins奴隶提供服务的docker镜像。
该图像需要Java和SSHD。
目前,我有一个可以充当 Jenkins 奴隶的 docker 容器。我的奴隶内部的用户是我在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
现在,我希望我的 Jenkins -奴隶能够构建docker镜像。因此,我的 Jenkins 需要运行的每个docker-command都会在此slave上执行。为此,我必须将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
...
所以现在我不得不更改Dockerfile,因为默认情况下,只有root用户才能使用docker。我希望我的jenkins用户可以执行docker命令,所以我更改了Dockerfile并添加了:
RUN groupadd -g 983 docker \
&& usermod -a -G docker jenkins
现在,我可以使用jenkins用户执行
ssh jenkins@172.19.0.2
并执行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
,以便也可以查找该主机信息。