在 docker 中,容器内创建的文件在从主机检查时往往具有不可预测的所有权。在默认情况下,卷上的文件的所有者是 root (uid 0) ,但是一旦容器中涉及到非 root 用户帐户并将其写入文件系统,从主机的角度来看,所有者或多或少会变得随机。
It is a problem when you need to access volume data from the host using the same user account which is calling the docker commands.
典型的变通方法是
docker run
命令,然后在入口点脚本中对卷运行一些 chown
命令。这两种解决方案都可以对容器外的实际权限提供一些控制。
我希望用户名称空间是这个问题的最终解决方案。我使用最近发布的版本1.10运行了一些测试,并将用户重新映射设置为我的桌面帐户。然而,我不确定它是否能使挂载卷上的文件所有权更容易处理,我担心它实际上可能正好相反。
假设我启动这个基本容器
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
然后检查来自主机的内容:
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
This number '100000' is a sub-UID of my host user, but since it does not correspond to my user's UID, I still can't edit test.txt without privileges. This sub-user does not seem to have any affinity with my actual regular user outside of docker. It's not mapped back.
由于名称空间中出现了 UID->sub-UID
映射,本文前面提到的在主机和容器之间对齐 UID 的解决方案不再有效。
那么,是否有一种方法可以在启用了用户名称空间的情况下运行 docker (为了提高安全性) ,同时仍然可以让运行 docker 的主机用户拥有卷上生成的文件?