码头工人作曲.同一容器上另一个卷内的卷.它是如何工作的?



我正在尝试创建一个相对简单的设置来开发和测试 npm 包。事实上,一个问题是,将代码卷挂载到容器后,它会替换node_modules。

我尝试了很多通常合乎逻辑的东西,主要目的是node_modules移动到另一个位置,然后在配置文件中引用它。它有效,但解决方案很丑陋。此外,全局安装 webpack 不是好的做法,但我的解决方案需要它。

但是,一段时间后,我发现这个看起来很优雅的解决方案正是我所需要的,但它也有一个问题。我不完全明白,它是如何工作的。

我对一切运作方式的版本。

  1. Docker 根据容器路径对卷挂载重新排序

  2. Docker首先挂载子目录卷

  3. Docker 挂载父目录卷,但由于无法解释的机制,它不会覆盖子目录卷...

  4. ???

  5. 利润。node_modules目录已经到位,webpack 运行完美。

所以,我真的很想了解它是如何实现所有这些黑魔法的。因为没有这些知识,我觉得我错过了一些重要的东西。
那么,伙计们,它是如何工作的? 提前谢谢。

services:
react-generic-form:
image: react-generic-form:package
container_name: react-generic-form-package
build:
dockerfile: dev.Dockerfile
context: ./package
volumes:
- "./package:/package"
- "/package/node_modules"

Docker 守护程序在创建容器时,会对所有挂载点进行排序以避免阴影。 (在非 Windows 上,这发生在(*github.com/docker/docker/daemon.Daemon).setupMounts中。 因此,在您的示例中:

  1. Docker 守护程序发现/package/package/node_modules都包含存储在容器文件空间之外的数据。
  2. 它将这些最短到最长排序。
  3. 它挂载/package,作为绑定挂载到命名主机目录。 (首先,因为它是一个较短的路径名。
  4. 它挂载/package/node_modules,在以前的挂载中隐藏等效目录,可能是作为绑定挂载到/var/lib/docker/volumes某处具有长十六进制标识符名称的目录。

您可以使用docker-compose.yml文件进行更多实验,例如

version: '3'
services:
touch:
image: busybox
volumes:
- ./b:/a/b
- ./a:/a
command: touch /a/b/c

请注意,无论您按哪个顺序放置volumes:,您都会得到一个空目录./a/b(它成为容器内的挂载点),以及一个空文件./b/c(touch命令的结果)。

另请注意此处的语句,即node_modules目录包含数据,这些数据应在容器调用中持久化,并且具有独立于容器或其基础映像的生命周期。 更改映像并重新运行docker-compose up不会影响此卷的内容。

最新更新