我的docker-compose.yml
文件中有以下内容:
volumes:
- .:/var/www/app
- my_modules:/var/www/app/node_modules
我这样做是因为我的主机上没有node_modules
,并且所有内容都安装在映像中并位于/var/www/app/node_modules
。
我对此有两个问题:
在我的主机中创建一个名为
node_modules
的空文件夹。如果我将另一个卷(命名或匿名)添加到.yml
文件中的列表,它将显示在包含我的.yml
文件的同一文件夹中的主机目录中。从这个答案来看,这似乎与这两个映射同时进行的事实有关。但是,为什么我的主机上的文件夹为空?它不应该 a) 包含指定卷中的文件或 b) 根本不显示在主机上吗?Docker 如何知道在初始化卷时检查映像中的底层
/var/www/app/node_modules
,而不仅仅是说"哦,node_modules
不存在"(因为我假设主机绑定挂载发生在命名卷初始化之前,因此/var/www/app
不应该再有一个名为node_modules
的文件夹。当我在主机上创建一个示例node_modules
文件夹和一个新卷同时保持my_modules:/var/www/app/node_modules
时,它似乎甚至可以工作——它似乎仍然使用来自图像而不是来自主机的node_modules
(这不是我所期望的,尽管不是不需要的)。
作为一个实现细节,Docker 实际上在挂载卷时使用 Linux 内核文件系统挂载工具。 要装载卷,必须将其装载到目录中,因此,如果装载目标尚不存在,它将创建一个新的空目录作为装入点。 如果装入点本身位于已装入的卷内,您将看到已创建空目录,但装入不会回显出来。
(如果你在 Linux 主机上,请尝试在容器运行时在 shell 中运行mount
。
那是:
/container_root/app
是绑定挂载到/host_path/app
;它们是相同的底层文件。mkdir /container_root/app/node_modules
也创造了/host_path/app/node_modules
。- 在
/container_root/app/node_modules
上安装其他东西不会导致在/host_path/app/node_modules
上安装任何东西。 - 。这将留下一个空的
/host_path/app/node_modules
目录。
首次启动容器时,只有在将空卷装载到容器中时,映像中的内容才会复制到卷中。 你告诉 Docker 此目录包含需要保留超过容器生命周期的关键数据。 这不是一个神奇的"不使用主机目录卷"旋钮,如果您执行更改package.json
文件之类的操作,Docker 将不会更新此卷的内容。