Visual studio code 为什么要将节点_模块移动到父目录

Visual studio code 为什么要将节点_模块移动到父目录,visual-studio-code,node-modules,Visual Studio Code,Node Modules,在Visual Studio代码的Docker扩展中,在Dockerfile模板中,节点\u模块目录被移动到父目录。我说的是: 为什么要这样做?这是为了利用Docker中的缓存机制。通常,您的Dockerfile中会有以下内容: 1. RUN apt-get #bunch of stuff you want installed 2. COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] 3. RUN n

在Visual Studio代码的Docker扩展中,在Dockerfile模板中,节点\u模块目录被移动到父目录。我说的是:


为什么要这样做?

这是为了利用Docker中的缓存机制。通常,您的
Dockerfile中会有以下内容:

1. RUN apt-get #bunch of stuff you want installed
2. COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
3. RUN npm install --silent && mv node_modules ../
4. COPY . .
5. CMD node index.js
Docker在“层”中构建其图像,您可以认为在执行
Dockerfile
中的每一行时都会添加每一层

那么我们在上面的片段中所说的是:

  • 运行apt get
  • 并将层提交到缓存
  • 接下来,将
    package.json
    文件从主机复制到容器,提交层
  • 运行
    npm install
    ,然后将
    node\u modules
    文件夹向上移动一个目录,
    npm
    将递归地向上搜索,直到找到
    node\u modules文件夹
    ,因此你的应用程序不会在意。提交此层
  • 将当前文件夹中包含的源代码复制到容器中,提交此层
  • 最后,当容器运行时,使用命令
    node index.js
  • 这个系统的美妙之处在于Docker只会从上一次构建容器以来发生变化的地方重新构建容器。因此,在我们的例子中,如果上一层发生了更改,比如更新的
    package.json
    ,它将只运行
    npm install…
    。如果没有,那么它将不会执行
    npm install
    命令,即使,
    index.js
    可能已经更改

    当然,请记住,您应该在
    .dockerginore
    文件中列出
    节点\u模块
    ,以便
    复制不尝试拾取它。

    我的问题是为什么
    mv节点\ u模块../
    部件?我理解它是如何工作的,但我想知道为什么会这样做。为什么要将节点模块向上移动到目录中?为什么不运行npm install--production--silent
    并保持node_模块不变?
    1. RUN apt-get #bunch of stuff you want installed
    2. COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
    3. RUN npm install --silent && mv node_modules ../
    4. COPY . .
    5. CMD node index.js