为什么将 node_modules 移动到父目录

nun*_*uno 7 node-modules visual-studio-code

在 Visual Studio Code 的 Docker 扩展中,在 Node.js Dockerfile 模板中,将 node_modules 目录移动到父目录,在这一行中

RUN npm install --production --silent && mv node_modules ../
Run Code Online (Sandbox Code Playgroud)

mv node_modules ../我看来毫无用处。有理由这样做吗?

Tha*_*Don 7

更新: 找到了“为什么”的一个很好的解释。请参阅:处理节点模块部分

TLDR;让您可以在容器内外运行应用程序,而不必担心 node_modules 中特定于操作系统的项目将无法在主机和容器之间运行。

原始(如评论中指出的错误)答案:

这是为了利用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
Run Code Online (Sandbox Code Playgroud)

Docker 在“层”中构建它的镜像,你可以认为每一层都被添加为Dockerfile执行中的每一行。

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

  1. 运行apt-get图层并将其提交到缓存
  2. 接下来,将package.json文件从主机复制到容器,提交层
  3. 运行npm install,然后将node_modules文件夹向上移动一个目录,npm将向上递归搜索,直到找到一个node_modules folder,因此您的应用程序不会在意。提交这一层。
  4. 将当前文件夹中包含的源代码复制到容器中,提交此层
  5. 最后,当你的容器运行时,使用命令 node index.js

这个系统的美妙之处在于,Docker 只会从自上次构建容器以来发生变化的地方重新构建容器。所以在我们的例子中,它只会npm install…在前一层发生变化时运行,比如更新的package.json. 如果没有,那么它不会执行npm install命令,即使说,index.js可能已经改变。

当然,请记住,您应该已经node_modules在您的.dockerignore文件中列出,这样COPY . .就不会试图将其取走。

  • 我的问题是 *为什么* `mv node_modules ../` 部分?我了解它是如何工作的,但想知道为什么这样做。为什么要将 node_modules 移到一个目录上?为什么不直接“RUN npm install --product --silent”并保留 node_modules 不变? (2认同)