【问题标题】:How to get GID of group on host in Dockerfile如何在 Dockerfile 中获取主机上组的 GID
【发布时间】:2016-08-05 17:26:46
【问题描述】:

我正在构建一个 docker 镜像,它将为 als jenkins slave 服务。 映像需要 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

现在我希望我的 jenkins-slave 能够构建 docker 映像。所以我的詹金斯需要运行的每个 docker-command 都将在这个从服务器上执行。为此,我必须将我的 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?

【问题讨论】:

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

标签: jenkins docker docker-compose dockerfile


【解决方案1】:

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 才能同时查看该主机信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2019-12-03
    • 1970-01-01
    • 2018-08-01
    • 2017-08-12
    • 1970-01-01
    • 2014-05-23
    相关资源
    最近更新 更多