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

比方说,我有一个非root用户运行的容器,我想绑定一个卷目录从主机到该容器。 容器然后将写入该目录。 假设主机上的目录是/tmp/container/data 。 如果该path不存在于主机上,我观察到它是由所有权创build的(由docker)。 因此,容器不能写入任何东西到目录(访问被拒绝),因为我的容器不是用root用户运行的。

当然,我可以在启动容器之前在主机端用正确的权限创build/tmp/container/data目录,但是这个解决scheme显然不能缩放 – 我将不得不为每个容器从目录不存在的主机使用绑定卷。

所以我的问题是,什么是最好的方式来使用主机的绑定卷的目录还不存在,同时仍然让非根容器的写权限的卷。

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

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

  • 使用命名的卷。 这些被初始化为该位置图像中的目录权限。 这与将主机上的完整path更改为卷的简短名称一样简单。
  • 以root用户身份运行容器,并在启动应用程序之前使入口点修复权限并放到用户。 类似的东西是在我最近扔在github上的jenkins-docker项目中完成的。
  • 在容器中包含一个脚本,权限为setuid-root,它执行目录的chown。