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

时间:2016-08-05 17:26:47

标签: jenkins docker docker-compose dockerfile

我正在建造一个将为als jenkins奴隶服务的码头图像。 该映像需要Java和SSHD。 目前我有一个可以作为詹金斯奴隶的码头工人集装箱。我的奴隶中的用户是我在dockerfile中创建的用户jenkins。

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
      ...

现在我希望我的jenkins-slave能够构建docker图像。所以我的jenkins需要运行的每个docker-command都将在这个slave上执行。因此,我必须将我的docker套接字安装到我的从属容器中。

我使用docker-compose启动我的slave-container。在这里你看我如何开始我的奴隶:

RUN groupadd -g 983 docker \
&& usermod -a -G docker jenkins

所以现在我不得不更改我的Dockerfile,因为默认情况下只有root用户才能使用docker。我希望我的jenkins用户可以执行docker命令,所以我更改了我的Dockerfile并添加了:

ssh jenkins@172.19.0.2

现在我能够执行gid并使用jenkins用户执行docker命令。 但这只能起作用,因为我主机上的docker组的983也是gid(centos7)。但在我的Ubuntu上1001gid。那么我的整个设置将无法正常工作。所以现在我的问题是:

您的dockerfile中有没有办法到WHERE DateColumn >= CASE WHEN DATEPART(dw,GETDATE()) = 1 -- datepart returns an integer, so no quotes THEN DATEADD(wk,DATEDIFF(wk,0,GETDATE()) - 1,0) ELSE DATEADD(wk,DATEDIFF(wk,0,GETDATE()),0) END 主机?

1 个答案:

答案 0 :(得分:1)

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

BMitch建议在整个组织中使用一致的GID(和UID)是最佳解决方案。这通常是一个好主意,不仅仅是码头工人。它有助于集中用户管理,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逻辑可以在启动器脚本中的容器启动时运行,然后启动组设置然后启动詹金斯。您可能需要在容器中的某处安装/etc/group以便能够查看主机信息。