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

Moo*_*lit 8 docker

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

当然,我可以/tmp/container/data在启动容器之前在主机端创建具有正确权限的目录,但是这个解决方案显然不能扩展 - 我必须为每个我想要使用绑定卷的容器都这样做目录不存在的主机。

所以我的问题是,将来自主机的绑定卷用于尚不存在的目录,同时仍然让非根容器具有对该卷的写访问权限的最佳方法是什么。

BMi*_*tch 7

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

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

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