在docker中,从主机检查容器时,在容器内部创建的文件往往具有不可预测的所有权。默认情况下,卷上文件的所有者是root(uid 0),但是一旦非root用户帐户包含在容器中并写入文件系统,从主机的角度来看,所有者就会或多或少地变得随机。
当您需要使用调用docker命令的同一用户帐户从主机访问卷数据时,这是一个问题。
典型的解决方法是
- 在创建时在Dockerfile中强制用户uID(非便携式)
- 将主机用户的UID
docker run
作为环境变量传递给命令,然后chown
在入口点脚本中在卷上运行某些命令。
这两种解决方案都可以对容器外部的实际权限进行一些控制。
我希望用户名称空间是此问题的最终解决方案。我已经对最近发布的1.10版和--userns-remap设置为我的桌面帐户进行了一些测试。但是,我不确定它是否会使挂载卷上的文件所有权更容易处理,恐怕实际上相反。
假设我启动这个基本容器
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
这个数字“ 100000”是我的主机用户的一个子UID,但是由于它不对应于我的用户的UID,因此我仍然无法在没有特权的情况下编辑test.txt。该子用户似乎与docker之外的我的实际普通用户没有任何亲和力。它没有被映射回来。
这篇文章前面提到的变通办法是在主机和容器之间对齐UID,由于 UID->sub-UID
名称空间中发生映射,。
然后,是否有一种方法可以在启用用户命名空间的情况下运行docker(以提高安全性),同时仍使运行docker的主机用户拥有在卷上生成的文件的可能性?