对应用程序进行Docker化非常简单,有效,但是优化Docker Image的大小是棘手的部分。 Docker易于使用,但是一旦应用程序开始扩展,镜像大小就会呈指数增长。通常,大多数情况下,应用程序的Node.js docker镜像大小超过1 GB。

为什么镜像大小很重要较大的docker镜像需要更多空间,这意味着增加费用。

较长的构建时间-将镜像通过网络推送会花费更长的时间,并导致CI管道延迟。

让我们开始优化

这是使用VueJS应用程序构建的演示应用程序。

这是初始的Dockerfile。

FROM node:10

WORKDIR /app

COPY . /app

EXPOSE 8080

RUN npm install http-server -g

RUN npm install && npm run build

CMD http-server ./dist

该镜像的大小为1.34GB:

让我们开始逐步优化。

1:使用多阶段Docker构建

多阶段构建可通过在单个Dockerfile中使用多个中间镜像来轻松优化Docker镜像。在此处了解更多信息。通过使用多阶段构建,我们可以在构建镜像中安装所有依赖项,并将它们复制到精简运行时镜像中。

FROM node:10 AS BUILD_IMAGE

WORKDIR /app

COPY . /app

EXPOSE 8080

RUN npm install && npm run build

FROM node:10

WORKDIR /app

# copy from build image

COPY --from=BUILD_IMAGE /app/dist ./dist

COPY --from=BUILD_IMAGE /app/node_modules ./node_modules

RUN npm i -g http-server

CMD http-server ./dist

现在,此镜像的大小为1.24GB:

2:删除开发依赖项并使用 Node Prune 工具

node-prune是一个开源工具,用于从node_modules文件夹中删除不需要的文件。通常在生产环境中根本不需要Npm包中的测试文件,markdown文件,类型文件和* .map文件,大多数开发人员都不会从生产包中删除它们。通过使用node-prune,可以安全地将其删除。

我们可以使用它来删除开发依赖项:

npm prune --production

进行这些更改后,Dockerfile将如下所示:

FROM node:10 AS BUILD_IMAGE

RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin

WORKDIR /app

COPY . /app

EXPOSE 8080

RUN npm install && npm run build

# remove development dependencies

RUN npm prune --production

# run node prune

RUN /usr/local/bin/node-prune

FROM node:10

WORKDIR /app

# copy from build image

COPY --from=BUILD_IMAGE /app/dist ./dist

COPY --from=BUILD_IMAGE /app/node_modules ./node_modules

RUN npm i -g http-server

CMD http-server ./dist

通过使用此选项,我们将整体大小减小到1.09GB。

3:选择较小的最终基础镜像

在对Node.js应用程序进行docker化时,有很多基本镜像可供选择。

这里我们将使用 alpine 镜像; alpine是一个精简的docker镜像,具有最少的软件包,但足以运行节点应用程序。

FROM node:10 AS BUILD_IMAGE

RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin

WORKDIR /app

COPY . /app

EXPOSE 8080

RUN npm install && npm run build

# remove development dependencies

RUN npm prune --production

# run node prune

RUN /usr/local/bin/node-prune

FROM node:10-alpine

WORKDIR /app

# copy from build image

COPY --from=BUILD_IMAGE /app/dist ./dist

COPY --from=BUILD_IMAGE /app/node_modules ./node_modules

RUN npm i -g http-server

CMD http-server ./dist

通过使用此Dockerfile,镜像大小降至157MB 。

结论

通过应用这3个简单步骤,我们将docker镜像大小减小了10倍。

PS: 本文属于翻译,原文

modules node 太大了_如何将Node.js Docker镜像大小减小10倍相关推荐

  1. node环境变量_实际使用Node环境变量的方法如下

    node环境变量 Environment variables are a fundamental part of Node development, but for some reason I nev ...

  2. 百度怎么进行模糊搜索_怎么在百度上准确搜索,提高10倍效率?

    人生下来就喜欢问为什么 ?小时候爱问父母,父母会直接告诉我们答案:长大后我们就用搜索引擎,百度.谷歌.搜狗等等获取资料知识,但是很难搜索准确的答案.今天小编就来教大家几个实用的(以百度为例)搜索引擎使 ...

  3. java node子节点_[Java教程]Node节点

    [Java教程]Node节点 0 2016-12-28 15:01:17 1.Node:节点 元素节点->HTML标签 文本节点->文字 但是在标准浏览器(除了IE6~8)中会把空格和换行 ...

  4. cad菜单栏快捷键_拒绝效率低下,教你瞬间提升10倍!老师傅珍藏多年CAD快捷键...

    效率一直都是标榜职场人工作质量的一个标准,效率低下就是一个很烦恼的问题,特别是对AutoCAD绘图设计这样一个行业,如果你的绘图效率低,那么只有加班赶点的命. 日渐消瘦,身体可不允许啊,还是要从根本解 ...

  5. maven项目中如何直接访问某一个页面_整一个自己的docker镜像

    获取镜像的途径有两个,一是从镜像仓库获取,如官方的Docker Hub,二是自定义.上文已经介绍如何从镜像仓库获取镜像,本文基于一个Springboot项目,来介绍自定义一个镜像的基本流程. 1. 定 ...

  6. iso镜像添加软件包_超薄Docker容器-减少Docker镜像大小的指南

    Photo by William Warby on Unsplash 您是否曾经想过为什么您的单应用程序Docker容器会增长到400 MB? 或者,也许为什么一个只有几十MB的应用程序二进制文件会生 ...

  7. 新手赶紧收藏起来,播放量太低怎么办?5大技巧让你播放量翻10倍

    有的人发布了很长时间的视频作品,为什么播放量一直上不去呢? 有的时候只有个位数和两位数,为了给大家解决这样的问题,给小伙伴们整理了几个小技巧,来帮你们提升作品的播放量. 1.视频格式 有的人拍摄.剪辑 ...

  8. node.js使用手册_权威的Node.js手册

    node.js使用手册 Note: you can get a PDF, ePub, or Mobi version of this handbook for easier reference, or ...

  9. 集群资源分配_分析下 Node.js 关于集群的那些事

    需要了解的基础概念 一个应用程序中,至少包含一个进程,一个进程至少包含一个线程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位 线程(Thr ...

最新文章

  1. Camera Calibration 相机标定
  2. 他们用卷积神经网络,发现了名画中隐藏的秘密
  3. Java - 将整数转换为字符串[duplicate]
  4. C++中的private protected public区别
  5. Silverlight中使用动画的技巧
  6. 1.3 编程基础之算术表达式与顺序执行(20题)
  7. 使用ACDsee在一张纸上打印多张图片
  8. Makefile模板的继续改进
  9. Oracle和Mysql的区别 转载
  10. 马斯克又一个宏伟蓝图即将启动:卫星高速上网,没有中间商赚差价
  11. IDEA使用和实用小技巧
  12. L1-021 重要的话说三遍 (5 分) — 团体程序设计天梯赛
  13. 二极管计算机原理,TVS二极管原理及其应用电路图
  14. 计算机与调制解调器之间接口为,单片机串行接口和调制解调器如何实现远程通信...
  15. Java就业面试问题大全
  16. diskgenius 数据迁移_如何无损将UEFI格式的系统从SATA盘迁移到NVME SSD中
  17. PTA L1-040:最萌情侣身高差 (python)
  18. word2000来处理图象(转)
  19. 基于内容的视频信息检索系统
  20. 在虚拟机上安装Ubuntu

热门文章

  1. 森林怎么训练野人_第五人格:野人技能曝光!野猪可以骑,庄园中或将迎来新玩法!...
  2. 编程随想 关系图_支持PLC编程的5大语言,全部会用的才是大神!
  3. C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理
  4. 嵌入式系统与人工智能
  5. 7个JavaScript在IE和Firefox浏览器下的差异写法
  6. TOP100summit:【分享实录-QQ空间】10亿级直播背后的技术优化
  7. Mysql 电商常用的时间操作(当天,昨天,7天,30天,半年,全年,季度等等)...
  8. 【Computer Organization笔记29】大作业展示
  9. 我爬了价值1800亿的商品信息
  10. php如何安装源码包,php源码包安装步骤是什么