.dockerignore忽略node_modules文件夹引起的困惑

14

我想分享一下。我正在使用Dockerfile测试创建一个nodejs应用程序的Docker镜像/容器。一切顺利,直到我尝试添加.dockerignore文件时,我在其中列出了以下文件,并期望它们不会被复制到Docker镜像中:

node_modules 
dockerignore 
Dockerfile

以下是我的Dockerfile:

FROM node:latest
WORKDIR /app
ADD . .
RUN npm install
CMD node index.js

我使用现有的Dockerfile和新的.dockerignore文件重新构建了我的镜像。创建完成后,我运行了docker run -it --entrypoint sh <image name>命令来检查这些文件/文件夹是否不再出现。
Dockerfile和.dockerignore文件已经不存在了,但是node_modules文件夹仍然存在。
花了一段时间才意识到,也许镜像中的node_modules文件夹是由Dockerfile中的npm install步骤创建的,而不是从主机复制的文件夹。
我是正确的吗?

2
我花了一些时间才“意识到”可能是Dockerfile的npm install步骤创建了图像中的node_modules文件夹,而不是从主机复制的文件夹。我是对的吗?是的。 - tkausl
1
tkausl,如果我不在.dockerignore文件中包含node_modules,会发生什么?当执行npm install时,node_modules文件夹是否会被覆盖?因此,毕竟不需要在.dockerignore中包含node_modules吗? - punsoca
1
它可能很大,并且会减慢构建速度;ADD . . 步骤将其复制进去,因此您将获得一个更大的镜像;如果主机和容器不是相同的操作系统,则有可能安装错误架构的模块。 - David Maze
@DavidMaze,您能否请您审查一下我的答案并给予评论?我想确保我理解得正确。 - punsoca
3个回答

8
根据tkausl和David Maze的评论(感谢两位!),我得出了答案。
镜像内的 node_modules 是由 Dockerfile 的 'npm install' 步骤生成的。
至于问题:
如果 .dockerignore 文件中不包含 node_modules,Dockerfile 无论如何都会覆盖 node_modules,那为什么要把 node_modules 加入到 .dockerignore 文件中呢?
我收到的评论是,如果我将 node_modules 从 .dockerignore 文件中排除,那么 Docker 构建过程会因为不必要的复制 node_modules 而变慢,而且镜像的大小也会更大。
因此,明智之举是将 node_modules 放在 .dockerignore 文件中,以实现更高效的 docker build 过程。
更新:我尝试了从 .dockerignore 文件中删除 node_modules 并运行该场景,结果显示镜像大小为940MB,而将 node_modules 放在 .dockerignore 文件中创建镜像 - 尽管过程可能更有效率 - 输出镜像大小为942MB(大2MB)。

我有一个类似的观察,即无论是否在.dockerignore文件中包含node_modules,镜像大小都是相同的。在这两种情况下,在构建过程中我都会看到一条消息“传输上下文:490.12kB”。这非常微不足道,肯定不会传输node_modules文件夹。什么是更高效的构建?我不确定。 - DFB

2

将Docker视为一个全新的盒子,在其中安装所有内容并给出运行特定任务的命令。

在这种情况下,尝试两件事

  1. 创建.dockerignore文件并忽略您认为不想包含或让docker自己处理的所有文件。

    .git

    */node_modules

    ####### 其他文件...

  2. 在Dockerfile中只需将package.json复制为docker用于部署,因此仅package.json文件会发生更改。因此,请尝试添加 COPY package*.json ./ 在Dockerfile中。


0

顺便说一下,我在使用Docker时遇到了某些node_modules不可用的问题。

问题在于它们存在于应用程序中,因此复制包并没有帮助,但是它们对Docker Compose VM不可用。

在将它们包含在VM中之前,我运行了docker-compose build --no-cache,然后它们就可用了。

也许这可以避免像我一样的人为此苦恼数小时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接