2017-06-15 26 views
1

假设我有一个容器以非root用户用户运行,我想要将主机上的卷目录绑定到该容器中。该容器然后将写入该目录。说,主机上的目录是/tmp/container/data。如果该路径没有而不是存在于主机上,我观察到它被创建(通过docker),所有权为。因此,容器无法将任何内容写入该目录(访问被拒绝),因为我的容器未与用户一起运行。将不存在的主机目录挂载到非根容器中

当然,我可以照顾在启动容器之前在主机端创建具有正确权限的/tmp/container/data目录,但是此解决方案显然不能缩放 - 我将不得不为每个我想要的容器使用该目录不存在的主机的绑定卷。

所以我的问题是,什么是最好的方式来使用主机上的绑定卷来存放尚不存在的目录,同时让非根容器具有对卷的写入权限。

回答

1

您准确地描述了docker的正常行为,docker引擎中不存在的绑定挂载将被初始化为由root拥有的空目录。请注意,这在群集模式下不会发生,它将无法在主机上调度容器。

选项用来避免这种情况包括:

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