与 .dockerignore 忽略的 node_modules 混淆

pun*_*oca 14 node.js docker

我以为我只是想分享这个。因此,我正在使用 Dockerfile 测试使用 Nodejs 应用程序创建 docker 映像/容器。一切都很顺利,直到我尝试添加 .dockerignore 文件,我在其中列出了以下文件,希望它们不会被复制到 docker 映像中:

node_modules 
dockerignore 
Dockerfile
Run Code Online (Sandbox Code Playgroud)

这是我的 Dockerfile:

FROM node:latest
WORKDIR /app
ADD . .
RUN npm install
CMD node index.js
Run Code Online (Sandbox Code Playgroud)

因此,我使用现有的 Dockerfile 和新的 .dockerignore 文件废弃并重建了我的映像。创建后,我跑去docker run -it --entrypoint sh <image name>检查那些文件/文件夹是否不再出现。

Dockerfile.dockerignore消失了。但node_modules文件夹仍然存在。

我花了一段时间才“意识到”node_modules图像中的文件夹可能是由 Dockerfilenpm install步骤创建的,而不是从主机复制的文件夹。

我对吗?

pun*_*oca 8

所以我根据 tkausl 和 David Maze 的评论得到了答案(谢谢大家!)。

图像内部node_modules是从 Dockerfile 的“npm install”步骤生成的。

至于问题:

如果.dockerignore不包含node_modules,Dockerfile 无论如何都会被覆盖node_modules?那么为什么还要费心放入node_modules.dockerignore 文件呢?

我收到的评论是,如果我从 .dockerignore 文件中遗漏了 node_modules,那么 docker 构建过程会由于不必要的复制而减慢node_modules,而且图像会更大。

因此,谨慎的做法是保留node_modules内部.dockerignore文件,以提高流程效率docker build

更新:我确实尝试运行node_modules从 .dockerignore 文件中删除的场景,并且图像显示 940MB,而在文件node_modules内部创建图像.dockerignore- 尽管该过程可能更有效 - 输出图像为 942MB(大 2MB) 。