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

标签 docker

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

当然,我可以负责创建 /tmp/container/data在启动容器之前在主机端具有正确权限的目录,但这个解决方案显然不能扩展 - 我必须为每个容器都这样做.

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

最佳答案

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

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

  • 使用命名卷。这些被初始化为该位置图像中的目录权限。这就像将主机上的完整路径更改为卷的短名称一样简单。
  • 以 root 身份运行容器,并在启动应用程序之前使入口点修复权限并放到用户手中。与此类似的事情在 jenkins-docker 中完成。我最近在 github 上扔掉的项目。
  • 在容器中包含一个具有 setuid-root 权限的脚本,该脚本执行目录的 chown。
  • 关于docker - 将不存在的主机目录挂载到非根容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44574078/

    相关文章:

    将 Docker 容器代理为子域

    mysql - 在 OSX 中挂载 Docker 卷时权限被拒绝

    azure - 如何在azure中的两个不同端口上公开容器的Web应用程序?

    mysql - 更改容器分配的 IP 地址

    node.js - Nuxt js开发环境中CPU使用率高

    Docker:构建镜像时编辑my.cnf

    python - cookiecutter-django 上的数据库设置问题

    使用 -it 选项时 Docker 容器退出

    nginx - plesk 上的 Varnish + Nginx 代理配置

    macos - 为什么在 docker bind mount 中创建的文件的 uid 会因主机操作系统而异?