考虑下面这个简单的 Dockerfile:
FROM debian:testing
RUN adduser --disabled-password --gecos '' docker
RUN adduser --disabled-password --gecos '' bob
在一个没有其他东西的工作目录里:
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 似乎正在创建它遇到的 第一非根用户所拥有的任何主目录(即使该用户是在早期映像上声明的)。同样,这个 第一用户与我的主用户拥有相同的所有权权限。
问题1是这样吗?有人能给我指出这个文件吗,我只是基于上述实验的推测。
问题2 : 也许这只是因为它们在内核上具有相同的数值,如果我在一个我的主用户不是 id 1000
的系统上测试,那么在每种情况下权限都会被更改?
问题3 : 真正的问题当然是,‘我该怎么办?如果 bob
在给定的主机上以 bob
的身份登录,那么他应该能够以 bob
的身份运行容器,并且在他的主机帐户下没有更改文件权限。实际上,他需要以用户 docker
的身份运行容器,以避免他的帐户被更改。
我听到你问 我怎么会有这么奇怪的 Dockerfile 文件?。有时候我也想知道。我正在为一个 webapp (RStudio-server)编写一个容器,该容器允许不同的用户登录,它只使用来自 linux 机器的用户名和凭据作为有效的用户名。这给我带来了想要创建多个用户的可能不同寻常的动机。我可以通过仅在运行时创建用户来解决这个问题,一切都很好。但是,我使用的基本映像已经添加了一个单独的 docker
用户,这样就可以交互式地使用它,而无需以 root 用户身份运行(按照最佳实践)。这会破坏一切,因为该用户成为 第一用户,并最终拥有一切,所以尝试登录其他用户失败(应用程序无法启动,因为它没有写权限)。让启动脚本运行 chown
首先解决了这个问题,但是代价是链接卷更改权限(显然只有在链接卷时才会出现问题)。