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

问题描述 投票:-1回答:1

我正在尝试创建一个相对简单的设置来开发和测试npm包。问题在于,在将代码卷安装到容器之后,它将替换node_modules。

我尝试了很多一般逻辑的东西,主要是为了将node_modules移动到另一个位置,然后在配置文件中引用它。它有效,但解决方案很难看。此外,在全球范围内安装webpack并不是一个好习惯,但我的解决方案需要它。

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

我的版本如何运作。

  1. Docker根据容器路径重新排序卷安装
  2. Docker首先安装sub dir卷
  3. Docker安装父目录卷但由于原因不明,它不会覆盖子目录卷...
  4. ???
  5. 利润。 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 docker-compose volume
1个回答
0
投票

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/ctouch命令的结果)。

还要注意这里的语句,即node_modules目录包含数据,这些数据应该跨容器调用持久存在,并且与容器或其基本映像分开具有生命周期。更改图像并重新运行docker-compose up将不会影响此卷的内容。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.