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

我在使用Docker容器时遇到了一些问题(我在Ubuntu上,所以没有VMWare或者b2d的虚拟化)。 我已经构build了我的映像,并有一个正在运行的容器,它具有来自主机的一个共享(挂载)目录,以及来自主机的一个共享(挂载)文件。 以下是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- lFh显示装入项目的ownergroup已被更改为libuuid:libuuid 。 修改文件或父目录需要root权限,这阻碍了我的工作stream程(正如我从崇高的文本,而不是terminal,我提出了popuppipe理权限)。

为什么会发生? 我如何解决这个问题/正确处理这个问题? 从pipe理数据卷:将主机文件挂载为数据卷 :

注意:用于编辑文件(包括vi和sed-in-place)的许多工具可能会导致inode更改。 由于Docker v1.1.0,这将产生一个错误,如“sed:无法重命名./sedKdJ9Dy:设备或资源繁忙”。 在你想编辑挂载文件的情况下,反而挂载父目录通常是最简单的。

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

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

我正在使用这个容器来开发另一个程序的模块,并且不希望pipe理一个只有数据的容器 – 唯一重要的文件来自我的主机; 其他地方不需要持久性(如数据库等)。

  • Dockerfile
  • /build立
  • 在pastebin上创build,以避免更长的post。 永不过期。

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

 docker run -dit \ -p 80:80 \ --name my-container \ -v $(pwd)/components:/var/www/wp-content/plugins/my-plugin-directory/components \ -v $(pwd)/index.php:/var/www/wp-content/plugins/my-plugin-directory/index.php \ my-image 

它看起来像你的chown -R nginx:nginx ...命令在你的容器里正在改变你的文件的所有权位在你的主机上由libuuid所有。

请参阅了解docker中的用户文件所有权:如何避免更改链接的卷的权限,以获取有关主机和docker容器之间的文件所有权位如何工作的基本说明。