Docker 组成。同一容器上另一个卷内的卷。它是如何工作的?

Nik*_*kin 9 volume docker docker-compose

我正在尝试创建一个相对简单的设置来开发和测试 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"
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 8

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
Run Code Online (Sandbox Code Playgroud)

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

还要注意这里的声明,该node_modules目录包含数据,应该在容器调用之间持久化,并且具有与容器或其基础映像分开的生命周期。更改映像并重新运行docker-compose up不会影响此卷的内容。