考虑以下简单的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
的主目录的所有权。在容器中运行:
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似乎会让任何一个家目录都归属于第一个非root用户(即使该用户在较早的镜像中已声明)。同样地,这个第一个用户对应于与我的本地用户相同的所有权权限。
问题1:这是正确的吗? 能否有人指向相关文档,我只是根据上述实验推测出来的。
问题2:也许这只是因为它们在内核中具有相同的数字值,在我的主机用户不是id 1000
的系统上测试,则权限将在每种情况下都被更改?
问题3:当然,真正的问题是“我该怎么做?”,如果bob
在给定的主机上作为bob
登录,则他应该能够以bob
身份运行容器,而不会在其主机帐户下修改文件权限。按照现在的情况,他必须将容器作为用户docker
运行,以避免更改他的帐户。
我听到你问“为什么我的Dockerfile如此奇怪?”。有时候我也在想。我正在编写一个Web应用程序(RStudio-server)的容器,允许不同的用户登录,其中只需要使用来自Linux机器的用户名和凭据作为有效用户名。这给了我创造多个用户的或许不寻常的动因。我可以通过在运行时仅创建用户来绕过这个问题,并且一切都很好。但是,我使用了一个已添加了单个docker
用户的基本镜像,以便它可以交互式地使用而不必作为root运行(符合最佳实践)。这破坏了一切,因为该用户成为第一个用户并拥有所有内容,因此尝试以其他用户身份登录失败(应用程序无法启动因为缺少写权限)。将启动脚本首先运行chown
可以解决此问题,但成本是链接卷更改权限(如果我们链接卷,则显然是一个问题)。