我正在尝试创建一个相对简单的设置来开发和测试npm软件包。实际上是一个问题,在您将代码卷安装到容器后,它将替换node_modules。
我尝试了许多通常具有逻辑性的内容,主要目的是将node_modules移到另一个位置,然后在配置文件中引用它。它可以工作,但是解决方案很难看。另外,在全球范围内安装webpack也不是一个好习惯,但是我的解决方案需要这样做。
但是,一段时间后,我找到了这个解决方案,看起来很优雅,正是我需要的解决方案,但是它也有一个问题。我不完全了解它是如何工作的。
我关于一切运作方式的版本。
Docker根据容器路径重新排序卷安装
Docker首先安装了子目录卷
Docker挂载了父目录卷,但是由于无法解释的机制,它不会覆盖子目录卷...
???
利润。 node_modules目录就位,Webpack完美运行。
所以,我真的很想了解它实际上是如何完成所有这些黑魔法的。因为如果没有这方面的知识,我会感觉自己缺少了一些重要的东西。
那么,伙计们,它是如何工作的?
预先感谢。
merge()
答案 0 :(得分:0)
Docker守护程序在创建容器时会对所有安装点进行排序,以避免产生阴影。 (在非Windows上,这发生在(*github.com/docker/docker/daemon.Daemon).setupMounts
中。)因此,在您的示例中:
/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
不会影响该卷的内容。