Docker 撰写。同一容器上另一个卷内的卷。它是如何工作的?
Docker compose. The volume inside another volume on the same container. How does it work?
我正在尝试创建一个相对简单的设置来开发和测试 npm 包。事实上,一个问题是,在您将代码卷安装到容器后,它会替换 node_modules。
我尝试了很多通常合乎逻辑的东西,主要是为了将 node_modules 移动到另一个位置,然后在配置文件中引用它。它有效,但解决方案很难看。另外,全局安装 webpack 不是一个好的做法,但我的解决方案需要它。
然而,经过一段时间我发现了这个解决方案,它看起来很优雅,正是我所需要的,但它也有一个问题。我完全不明白,它是如何工作的。
这是我对一切运作方式的看法。
Docker 根据容器路径重新排序卷安装
Docker 首先挂载子目录卷
Docker 挂载父目录卷,但由于无法解释的机制,它不会覆盖子目录卷...
???
盈利。 node_modules dir 就位,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
中。)因此,在您的示例中:
- Docker 守护程序发现
/package
和 /package/node_modules
都包含存储在容器文件空间之外的数据。
- 它将这些从最短到最长排序。
- 它挂载
/package
,作为指定主机目录的绑定挂载。 (首先,因为它是一个较短的路径名。)
- 它挂载
/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
不会影响本卷的内容。
我正在尝试创建一个相对简单的设置来开发和测试 npm 包。事实上,一个问题是,在您将代码卷安装到容器后,它会替换 node_modules。
我尝试了很多通常合乎逻辑的东西,主要是为了将 node_modules 移动到另一个位置,然后在配置文件中引用它。它有效,但解决方案很难看。另外,全局安装 webpack 不是一个好的做法,但我的解决方案需要它。
然而,经过一段时间我发现了这个解决方案,它看起来很优雅,正是我所需要的,但它也有一个问题。我完全不明白,它是如何工作的。
这是我对一切运作方式的看法。
Docker 根据容器路径重新排序卷安装
Docker 首先挂载子目录卷
Docker 挂载父目录卷,但由于无法解释的机制,它不会覆盖子目录卷...
???
盈利。 node_modules dir 就位,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
中。)因此,在您的示例中:
- Docker 守护程序发现
/package
和/package/node_modules
都包含存储在容器文件空间之外的数据。 - 它将这些从最短到最长排序。
- 它挂载
/package
,作为指定主机目录的绑定挂载。 (首先,因为它是一个较短的路径名。) - 它挂载
/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
不会影响本卷的内容。