考虑以下琐碎的DOCKFILE:
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
.让我们try 修复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似乎正在创建它遇到的first个非根用户所拥有的任何主目录(即使该用户在早期图像中声明).同样,这first个用户与我家用户的所有权权限相同.
Question 1对吗?有人能给我指一下这方面的文件吗?我只是根据上面的实验进行推测.
Question 2:也许这只是因为它们在内核上都有相同的数值,如果我在一个我的家庭用户不是id 1000
的系统上测试,那么权限在任何情况下都会改变?
Question 3:当然,真正的问题是,‘我该怎么办?’如果bob
在给定的主机上以bob
的身份登录,他应该能够以bob
的身份运行容器,并且不会在他的主机帐户下更改文件权限.目前,他实际上需要以用户docker
的身份运行容器,以避免其帐户被更改.
我听到你在问Why do I have such a weird Dockerfile anyway?.有时我也很好奇.我正在为一个webapp(RStudio服务器)编写一个容器,它允许不同的用户登录,只需使用来自linux机器的用户名和凭据作为有效用户名.这给我带来了想要创建多个用户的可能不同寻常的动机.我可以通过只在运行时创建用户来解决这个问题,一切都很好.然而,我使用了一个基本映像,它添加了一个docker
用户,这样就可以在不以root用户身份运行的情况下交互使用它(根据最佳实践).这会 destruct 一切,因为该用户成为first用户并最终拥有一切,因此在其他用户失败时try 登录(应用程序无法启动,因为它缺乏写入权限).让启动脚本运行chown
首先解决了这个问题,但代价是链接卷更改权限(显然只有在链接卷时才有问题).