2

在下面的 docker 文件中,base image( )在容器中jenkins/jenkins为用户jenkins提供 UID1000和 GID 。1000

FROM jenkins/jenkins

# Install some base packages

# Use non-privileged user provided by base image
USER jenkins # with uid 1000 and GID 1000

# Copy plugins and other stuff

在 docker 主机(EC2 实例)上,我们也创建了类似的 UID 和 GID,

 $ groupadd -g 1000 jenkins
 $ useradd -u 1000 -g jenkins jenkins
 $ mkdir -p /abc/home_folder_for_jenkins
 $ chown -R jenkins:jenkins /abc/home_folder_for_jenkins

确保容器可以将文件写入/abc/home_folder_for_jenkinsEC2 实例。


在同一个 EC2 实例中我们需要注意的另一个方面是运行容器(除了上述容器)以在非特权模式下运行。

因此,在 docker 主机(EC2)上执行以下配置:

$ echo dockremap:165536:65536 > /etc/subuid
$ echo dockremap:165536:65536 > /etc/subgid
$ echo '{"debug":true, "userns-remap":"default"}' > /etc/docker/daemon.json

这个 dockerremap 配置不允许 jenkins 启动并且 docker 容器进入Exited状态:

$ ls -l /abc/home_folder_for_jenkins
total 0

删除 docker remap 配置后,一切正常。


为什么dockerremap配置不允许jenkins容器以jenkins用户身份运行?

4

2 回答 2

2

我实际上正在与它作斗争,因为它似乎不是很便携,但这是我发现的最好的。如上所述,在您的 docker 主机上,UID/GID 是来自容器的那些 + 中的值/etc/subuid& /etc/subgid。因此,您的主机上的“容器根目录”是 165536,而您的用户 jenkins 是 166536 (165536 + 1000)。

回到你的例子,你需要做的是

$ mkdir -p /abc/home_folder_for_jenkins
$ chown -R 166536:166536 /abc/home_folder_for_jenkins
于 2020-02-20T20:46:06.447 回答
1

用户命名空间偏移容器内用户的 UID/GID,以及容器内的任何文件。没有从容器内的 UID/GID 到外部主机 UID/GID 的映射(这会破坏目的)。因此,您需要偏移正在创建的目录的 UID/GID,或者只使用命名卷并让 docker 为您处理。我相信主机上的 UID/GID 将是 166536 (165536 + 1000) (我可能会在那里关闭一个,所以如果仍然失败,请尝试打开目录权限并查看创建了什么)。

于 2020-02-19T13:54:36.753 回答