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

标签 jenkins docker docker-compose dockerfile

我正在为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上,gid1001。因此,我的整个设置将无法正常工作。所以现在我的问题是:

有没有办法在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,以便也可以查找该主机信息。

关于jenkins - 如何在Dockerfile中获取主机上组的GID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38794818/

相关文章:

hudson - Jenkins 构建的基于提交的 View

jenkins - 将参数从for循环传递到jenkins管道中的多行sh

git - ERROR : Couldn't find any revision to build. 验证此作业的存储库和分支配置

postgresql - HeidiSQL 不会列出我的数据库

ruby-on-rails - 无法通过Rails Docker,Carrierwave将文件上传到AWS S3

jenkins - aws serverless.yml文件 "A valid option to satisfy the declaration ' opt :stage' could not be found"error

linux - 爆竹微虚拟机 : how to create custom Firecracker microVM and file system images

amazon-web-services - 使用单个容器配置将端口映射添加到Dockerrun.aws.json

python - 当我添加新命令进行撰写时,Docker Compose 与 Django 错误

docker-compose - Docker 工具箱 Windows - 无效的卷规范