我的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
文件的同一文件夹中的主机目录中。从this答案来看,这似乎与以下事实有关:这两个映射同时进行。但是,为什么主机上的文件夹为空?是不是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
(这不是我所期望的,尽管不是不必要的)。
答案 0 :(得分:2)
作为实现细节,Docker在每次装载卷时实际上都使用Linux内核文件系统装载工具。要挂载卷,必须将其挂载到目录上,因此,如果挂载目标尚不存在,它将创建一个新的空目录作为挂载点。如果挂载点本身位于挂载的卷中,则会看到创建了空目录,但挂载不会被回显。
(如果您使用的是Linux主机,请在容器运行时尝试在外壳中运行var smallLocations = $("input[roiname]").val();
。)
也就是说:
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
目录。 The first time you start a container,直到那时,如果将空卷装入容器,图像中的内容就会复制到该卷中。您是在告诉Docker该目录包含关键的 data ,这些关键的 data 需要保留的时间比容器的使用寿命更长。 “不要使用主机目录卷”旋钮不是一个魔术,如果您执行诸如更改/host_path/app/node_modules
文件的操作,Docker将不会更新该卷的内容。