与.dockerignore忽略的node_modules混淆

5jdjgkvh  于 2023-03-07  发布在  Docker
关注(0)|答案(3)|浏览(199)

我想我只是想分享这个。所以我正在用一个nodejs应用程序usiung Dockerfile测试一个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步骤创建的,而不是从主机复制的文件夹。
我说的对吗?

jchrr9hc

jchrr9hc1#

所以我根据tkausl和大卫迷宫的评论得到了答案(谢谢你们!)
映像内的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过程的效率。
更新:我确实尝试过从.dockerignore文件中删除node_modules来运行这个场景,图像显示为940 MB,而在.dockerignore文件中创建node_modules的图像--尽管这个过程可能更有效--输出图像为942 MB(大了2 MB)。

piok6c0g

piok6c0g2#

将Docker视为一个全新的机器,其中将安装所有内容并提供运行特定任务的命令
在这种情况下,尝试两种方法
1.创建. dockerignore文件,并忽略所有你认为你不想包括或让docker处理自己的文件。
. git语言

  • /节点模块

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

1.在Dockerfile中,只需将package.json复制为用于部署的docker,因此只有package.json文件会发生更改是有意义的。因此,尝试在Dockerfile中添加COPY package *. json ./。

hmmo2u0o

hmmo2u0o3#

FWIW我在使用Docker时遇到某些node_modules不可用的问题。
问题是它们存在于应用程序中,因此复制包没有帮助,但Docker Compose VM无法使用它们。
在升级compose示例以将它们包含在VM中之前,我运行了docker-compose build --no-cache,然后它们就可用了。
也许这可以避免有人像我一样挠头几个小时。

相关问题