将不存在的主机目录挂载到非root容器中

时间:2017-06-15 18:02:49

标签: docker

假设我有一个使用非root 用户运行的容器,我想将主目录中的卷目录绑定到该容器中。然后容器将写入该目录。比如,主机上的目录是/tmp/container/data。如果该路径在主机上存在,我会发现它(由docker)创建了所有权 root 。因此,容器无法在该目录中写入任何内容(访问被拒绝),因为我的容器未使用用户 root 运行。

当然我可以在启动容器之前在主机端创建具有正确权限的/tmp/container/data目录,但是这个解决方案显然无法扩展 - 我将不得不为每个容器执行此操作我想使用目录不存在的主机的绑定卷。

所以我的问题是,什么是使用主机中的绑定卷用于尚不存在的目录的最佳方式,同时仍然让非root容器具有对卷的写访问权。

1 个答案:

答案 0 :(得分:1)

您准确描述了docker的正常行为,来自docker引擎的不存在的绑定挂载将初始化为root拥有的空目录。请注意,这不会发生在swarm模式下,它将无法在主机上安排容器。

用于避免此问题的选项包括:

  • 使用命名卷。这些初始化为该位置图像中的目录权限。这就像将主机上的完整路径更改为卷的短名称一样简单。
  • 以root身份运行容器,并使入口点修复权限并在启动应用程序之前删除给用户。类似于此的事情是在我最近在github上抛出的jenkins-docker项目中完成的。
  • 在容器中包含一个具有权限setuid-root的脚本,该权限执行目录的chown。