考虑以下琐碎的Dockerfile:
FROM debian:testing
RUN adduser --disabled-password --gecos '' docker
RUN adduser --disabled-password --gecos '' bob
在没有其他任何工作目录中。构建docker映像:
docker build -t test .
然后在容器上运行bash脚本,将工作目录链接到bob的主目录上的新子目录中:
docker run --rm -it -v $(pwd):/home/bob/subdir test
谁拥有subdir
容器中的物品?在容器上,运行:
cd /home/bob/subdir
ls -l
我们看到的广告:
-rw-rw-r-- 1 docker docker 120 Oct 22 03:47 Dockerfile
圣烟!docker
拥有内容!回到容器外部的主机上,我们看到原始用户仍然拥有Dockerfile
。让我们尝试修复bob
home目录的所有权。在容器上,运行:
chown -R bob:bob /home/bob
ls -l
我们看到:
-rw-rw-r-- 1 bob bob 120 Oct 22 03:47 Dockerfile
可是等等!在容器外面,我们现在运行ls -l
-rw-rw-r-- 1 1001 1001 120 Oct 21 20:47 Dockerfile
我们不再拥有我们自己的文件。可怕的消息!
如果在上面的示例中仅添加一个用户,那么一切将会更加顺利。出于某种原因,Docker似乎会将其遇到的第一个非根用户拥有任何主目录(即使该用户是在较早的映像上声明的)。同样,第一个用户是与我的家庭用户相同的所有权权限的用户。
问题1正确吗?有人可以指出我的相关文档吗,我只是基于上述实验进行猜测。
问题2:也许这仅仅是因为它们在内核上具有相同的数值,并且如果我在我的家庭用户不是id的系统上进行测试,1000
那么在每种情况下权限都会改变吗?
问题3:当然,真正的问题是,“我该怎么办?” 如果以给定主机上的bob
身份登录bob
,则他应该能够以该身份运行该容器,bob
并且在其主机帐户下没有更改文件权限。就目前而言,他实际上需要以用户docker
身份运行容器,以避免更改其帐户。
我听到你在问为什么我仍然有这么奇怪的Dockerfile?。我有时也想知道。我正在为一个Webapp(RStudio服务器)编写一个容器,该容器允许不同的用户登录,该容器仅将linux计算机中的用户名和凭据用作有效的用户名。这给我带来了想要创建多个用户的不寻常动机。我可以通过仅在运行时创建用户来解决此问题,一切都很好。但是,我使用的基础映像添加了一个docker
用户,因此可以交互使用而无需以root用户身份运行(按照最佳做法)。由于该用户成为第一个用户,这破坏了一切用户并最终拥有所有内容,因此尝试在其他用户失败时尝试登录(该应用无法启动,因为它缺少写入权限)。chown
首先运行启动脚本可以解决此问题,但是要以链接卷更改权限为代价(显然,如果我们要链接卷,这只是一个问题)。