gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:46:02 27 4
gpt4 key购买 nike

我的 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 不存在”(因为我假设主机绑定(bind)挂载发生在命名卷初始化之前,因此 /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 的绑定(bind)挂载;它们是相同的基础文件。
  • 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 目录。

The first time you start a container ,只有这样,如果您将一个空卷装载到容器中,图像中的内容才会复制到该卷中。您是在告诉 Docker 该目录包含关键数据,这些数据需要保留的时间超过容器的生命周期。这不是一个神奇的“不使用主机目录卷”旋钮,如果您执行更改 package.json 文件之类的操作,Docker 将不会更新此卷的内容。

关于docker - 为什么 docker-compose 在挂载命名卷时会创建一个空的主机文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56285283/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com