我想我只是想分享这个。所以我正在用一个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
步骤创建的,而不是从主机复制的文件夹。
我说的对吗?
3条答案
按热度按时间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)。piok6c0g2#
将Docker视为一个全新的机器,其中将安装所有内容并提供运行特定任务的命令
在这种情况下,尝试两种方法
1.创建. dockerignore文件,并忽略所有你认为你不想包括或让docker处理自己的文件。
. git语言
####### 其他文件...
1.在Dockerfile中,只需将package.json复制为用于部署的docker,因此只有package.json文件会发生更改是有意义的。因此,尝试在Dockerfile中添加COPY package *. json ./。
hmmo2u0o3#
FWIW我在使用Docker时遇到某些node_modules不可用的问题。
问题是它们存在于应用程序中,因此复制包没有帮助,但Docker Compose VM无法使用它们。
在升级compose示例以将它们包含在VM中之前,我运行了
docker-compose build --no-cache
,然后它们就可用了。也许这可以避免有人像我一样挠头几个小时。