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



我的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文件的同一文件夹中的主机目录中。从这个答案来看,这似乎与这两个映射同时进行的事实有关。但是,为什么我的主机上的文件夹为空?它不应该 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(这不是我所期望的,尽管不是不需要的)。

作为一个实现细节,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 将不会更新此卷的内容。

相关内容

  • 没有找到相关文章

最新更新