Node.js 为什么docker的形象太大了?NodeJS应用程序

Node.js 为什么docker的形象太大了?NodeJS应用程序,node.js,docker,Node.js,Docker,我正在将我的应用程序构建到docker映像中 我的docker文件: FROM node:12-alpine WORKDIR /usr/app COPY ./package.json ./package.json RUN yarn COPY ./src ./src COPY ./gulpfile.js ./gulpfile.js COPY ./tsconfig.json ./tsconfig.json RUN yarn build RUN rm -rf ./node_modules

我正在将我的应用程序构建到docker映像中

我的docker文件:

FROM node:12-alpine

WORKDIR /usr/app

COPY ./package.json ./package.json

RUN yarn

COPY ./src ./src
COPY ./gulpfile.js ./gulpfile.js
COPY ./tsconfig.json ./tsconfig.json

RUN yarn build

RUN rm -rf ./node_modules
RUN rm -rf ./src
RUN rm -rf ./gulpfile.js
RUN rm -rf ./yarn.lock
RUN rm -rf ./package.json
RUN rm ./tsconfig.json

RUN cd dist && yarn 

CMD ["node", "./dist/boot.js"]
构建完成后,我打开了docker镜像,发现我的应用在/user/app/dist中,大小为264MB,包括node_模块

但docker image有867MB

为什么?


我的dockerfile脚本有什么问题吗?我使用的是node alpine,它应该很小。

向Dockerfile添加行不会使图像变小。由于从层构造图像的方式,运行行通常会生成上一层的所有内容,以及该运行命令导致的任何更改

作为Dockerfile中的一个特定示例:

构建dist/目录的内容 长丝织物 保留上一层的全部内容 另外,添加应删除节点\模块目录的标记 运行rm-rf./node\u模块 正如@jornsharpe在评论中指出的,您可能正在寻找一个新的解决方案。这里的基本概念是,第二个FROM行将导致docker build完全从一个新的基本映像重新开始,但是您可以将-FROM=前一个阶段复制到最后一个阶段

您可以如下方式重建现有图像:

添加为内部版本供以后使用 从节点:12阿尔卑斯山建成 这正是你以前所拥有的 WORKDIR/usr/app 复制./package.json./package.json 粗纱 副本./src./src 复制./gulpfile.js./gulpfile.js 复制./tsconfig.json./tsconfig.json 长丝织物 现在构建实际图像,从头开始。 从节点:12 WORKDIR/usr/app COPY-from=build/usr/src/app/dist。 但不是它的节点树或其他任何东西 CMD[node,boot.js]
我建议采用多阶段构建,然后在第二阶段中只能安装产品依赖项。例如,如果没有我的应用程序docker容器有867-264 603MB,我认为这与产品依赖性无关。这是正常的容器大小?我机器上的节点:12 alpine是~80Mb,所以我不知道你有什么。你使用哪个命令获得图像的大小?我使用docker image列出我的图像,这是一个大小信息。哦,我在上面。非常感谢。现在它的最终图像变小了!最终大小为272MB。node_模块文件夹中有很多包