共享卷/文件权限/所有权(Docker)

时间:2015-08-03 05:10:51

标签: linux docker

使用Docker容器时我遇到了一个有点烦人的问题(我在Ubuntu上,所以没有像VMWare或b2d那样的虚拟化)。我已经构建了我的映像,并且有一个正在运行的容器,它有一个来自我的主机的共享(挂载)目录,以及一个来自我的主机的共享(挂载)文件。这是完整的"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" %D". 命令:

docker run

这很好用,docker run -dit \ -p 80:80 \ --name my-container \ -v $(pwd)/components:/var/www/components \ -v $(pwd)/index.php:/var/www/index.php \ my-image (及其内容)和文件都是适当共享的。但是,当我想对目录进行更改(例如添加新文件或文件夹)或编辑已安装的文件(或目录中的任何文件)时,由于权限不正确,我无法执行此操作。运行/components表示已装入项目的ls- lFhowner已更改为group。修改文件或父目录需要root权限,这会阻碍我的工作流程(因为我使用的是Sublime Text,而不是Terminal,我会看到一个管理员权限的弹出窗口。)

为什么会发生这种情况? 如何我可以解决这个/正确处理这个问题?来自Managing Data Volumes: Mount a Host File as a Data Volume

  

注意:许多用于编辑文件的工具(包括vi和sed --in-place)可能会导致inode更改。从Docker v1.1.0开始,这将产生一个错误,例如“sed:无法重命名./sedKdJ9Dy:设备或资源忙”。在您要编辑已安装文件的情况下,通常最容易安装父目录。

这似乎表明我应该安装两者的父目录,而不是挂载libuuid:libuuid/components。理论上听起来很棒,但基于/index.php选项的行为以及它与-v的交互方式,似乎我父目录中的每个文件都会被更改为归/directory所有。另外,我在父目录中有很多东西在容器中不需要 - 比如构建工具,各种文件,一些压缩文件夹等。挂载整个父目录似乎很浪费。

libuuid:libuuid上运行chown user:group并在我的主机上运行/components 让我可以解决此问题,并且似乎继续与容器同步。这是我每次运行装有主机卷的容器时都需要做的事吗?我猜测有一种更有效的方法可以做到这一点,而我只是没有在任何地方找到我的特定用例的解释。

我正在使用此容器为另一个程序开发模块,并且不想管理仅数据容器 - 唯一重要的文件来自我的主机;其他地方不需要持久性(如数据库等)。

  • Dockerfile
  • /setup
  • 在pastebin上创建,以避免更长的帖子。永不过期。

创建图像后,这是我正在使用的运行命令:

/index.php

1 个答案:

答案 0 :(得分:1)

您的容器中的chown -R nginx:nginx ...命令似乎正在更改您的文件上的所有权位,以便由您的主机上的libuuid拥有。

有关文件所有权位如何在主机与docker容器之间工作的基本说明,请参阅Understanding user file ownership in docker: how to avoid changing permissions of linked volumes