使用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- lFh
和owner
已更改为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
让我可以解决此问题,并且似乎继续与容器同步。这是我每次运行装有主机卷的容器时都需要做的事吗?我猜测有一种更有效的方法可以做到这一点,而我只是没有在任何地方找到我的特定用例的解释。
我正在使用此容器为另一个程序开发模块,并且不想管理仅数据容器 - 唯一重要的文件来自我的主机;其他地方不需要持久性(如数据库等)。
创建图像后,这是我正在使用的运行命令:
/index.php
答案 0 :(得分:1)
您的容器中的chown -R nginx:nginx ...
命令似乎正在更改您的文件上的所有权位,以便由您的主机上的libuuid
拥有。
有关文件所有权位如何在主机与docker容器之间工作的基本说明,请参阅Understanding user file ownership in docker: how to avoid changing permissions of linked volumes。