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

Linux 共享卷/文件权限/所有权(Docker),linux,docker,Linux,Docker,我在使用Docker容器时遇到了一个稍微令人恼火的问题(我在Ubuntu上,所以没有像VMWare或b2d那样的虚拟化)。我已经构建了我的映像,并且有一个正在运行的容器,其中有来自我的主机的一个共享(装载)目录和来自我的主机的一个共享(装载)文件。下面是完整的docker run命令: docker run -dit \ -p 80:80 \ --name my-container \ -v $(pwd)/components:/var/www/components \ -v $(pwd)/in

我在使用Docker容器时遇到了一个稍微令人恼火的问题(我在Ubuntu上,所以没有像VMWare或b2d那样的虚拟化)。我已经构建了我的映像,并且有一个正在运行的容器,其中有来自我的主机的一个共享(装载)目录和来自我的主机的一个共享(装载)文件。下面是完整的
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
这非常有效,组件(及其内容)和文件都可以适当地共享。但是,当我想更改目录(例如添加新文件或文件夹)或编辑装入的文件(或目录中的任何文件)时,由于权限不正确,我无法执行此操作。运行
ls-lFh
显示装载项目的
所有者和
组已更改为
libuuid:libuuid
。修改文件或父目录需要根权限,这会妨碍我的工作流程(因为我是从升华文本而不是终端工作的,我会看到一个管理员权限弹出窗口)

为什么会发生这种情况我如何解决/正确处理这个问题?发件人:

注意:许多用于编辑文件的工具(包括vi和sed)可能会导致inode更改。自Docker v1.1.0以来,这将产生一个错误,例如“sed:无法重命名。/sedKdJ9Dy:设备或资源繁忙”。如果要编辑装入的文件,通常最容易的方法是装入父目录

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

在我的主机上运行
/components
/index.php
上的
chown user:group
,可以解决这个问题,并且似乎可以继续与容器同步。这是不是每次运行装载了主机卷的容器时都需要执行的操作?我猜想有一种更有效的方法可以做到这一点,而我只是没有在任何地方找到对我的特定用例的解释

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

  • 在pastebin上创建,以避免出现更长的帖子。永不过期
创建映像后,我使用的是run命令:

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容器之间工作的基本说明,请参阅。

为什么不创建一个目录,并将这两个文件作为符号链接添加到该目录中,以便将创建的目录装载到容器中。@Viswesn,你能详细解释一下为什么你认为这是一个合适的解决方案吗?听起来你的CMD脚本中运行了一些可疑的东西,正在执行流氓chowning(docker不希望对现有文件或容器中装载的文件进行chown)-你能发布它吗,以及你的Dockerfile?@ChrisMcKinnel我已经添加了Dockerfile,CMD脚本(
/setup
)和我正在使用的run命令(当然,实际的目录/文件名因模糊而被更改)。您能否在主机上
cat/etc/passwd
并找到
libuuid
uid
,然后
docker exec-ti[container]bash
然后
cat/etc/passwd
并在容器中找到相应的
uid
?我有一种感觉,它将是
nginx
,就像你在做多个
chown-R nginx:nginx/var/www
——也许你在每个容器开始时都在chowning装载到
nginx