为什么在挂载命名卷时docker-compose会创建一个空的主机文件夹?

时间:2019-05-24 02:58:36

标签: docker docker-compose dockerfile

我的docker-compose.yml文件中包含以下内容:

volumes:
    - .:/var/www/app
    - my_modules:/var/www/app/node_modules

之所以这样做,是因为我的主机上没有node_modules,并且所有内容都安装在映像中,并且位于/var/www/app/node_modules

对此我有两个问题:

  1. 在名为node_modules的主机中创建了一个空文件夹。如果我在.yml文件的列表中添加另一个卷(命名卷或匿名卷),该卷将显示在包含.yml文件的同一文件夹中的主机目录中。从this答案来看,这似乎与以下事实有关:这两个映射同时进行。但是,为什么主机上的文件夹为空?是不是a)包含命名卷中的文件,或者b)根本不在主机上显示?

  2. 在初始化卷时,Docker如何知道从映像中检查基础的/var/www/app/node_modules而不是仅仅说“哦,node_modules不存在”(因为我假设主机绑定装入发生在命名卷初始化之前,因此/var/www/app不应再有一个名为node_modules的文件夹。当我在主机上创建示例node_modules文件夹时,它似乎也可以使用和一个新卷,同时保留my_modules:/var/www/app/node_modules-它似乎仍然从映像而不是从主机使用node_modules(这不是我所期望的,尽管不是不必要的)。

1 个答案:

答案 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将不会更新该卷的内容。