与 Docker 容器共享主机中的单个文件,并使容器 r+w 到同一个文件

And*_*ard 4 linux volume docker ubuntu-14.04

我遇到了一种情况,我有一个 .json 文件,我想在给定容器的运行之间保留该文件。此外,该文件需要由容器附加到其运行过程中。

到目前为止我一直使用的语法如下:

docker run -d -p 3001:3001 -v /usr/bob/database.json:/app/data/database.json:rw --name=myapp appImage  
Run Code Online (Sandbox Code Playgroud)

文件中没有插入任何内容(尽管我可以捕捉容器内部和外部的内容以确认其相同)。我已确保运行 docker 的 root 用户(是的,不是最佳实践)拥有该文件夹中的所有文件并具有完整的 rwx。

如果我在文件夹级别绑定,那么有效的是,例如:

docker run -d -p 3001:3001 -v /usr/bob:/app/data --name=myapp appImage
Run Code Online (Sandbox Code Playgroud)

谁能解释其中的区别吗?

我觉得共享对文件夹而不是单个文件的访问权限不太精确,并且还会导致应用程序中的结构变化(例如,同一文件夹中多个文件(加上提到的 .json 文件)的源代码控制)。

预先感谢您的任何指点。

谢谢,

安德鲁

BMi*_*tch 5

将文件挂载为卷会挂载容器内的特定 inode。许多修改文件的工具在写入文件的新副本时都会更改索引节点。这个新的索引节点将作为指向该文件名的新指针存储在目录中。当安装它们的目录时,您会看到主机中的更改,但否则您只能在容器内看到它,因为主机上的 inode 以及主机目录中指向它的指针未更改。

Docker 关于卷的教程中有关于此行为的更多详细信息:https://docs.docker.com/engine/tutorials/dockervolumes