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

为什么镜像大小很重要

  • 较大的docker镜像须要更多空间,这意味着减少费用。
  • 较长的构建工夫-将镜像通过网络推送会破费更长的工夫,并导致CI管道提早。

让咱们开始优化

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

这是初始的Dockerfile。

FROM node:10WORKDIR /appCOPY . /appEXPOSE 8080RUN npm install http-server -gRUN npm install && npm run buildCMD http-server ./dist

该镜像的大小为1.34GB:

让咱们开始逐渐优化。

1:应用多阶段Docker构建

多阶段构建可通过在单个Dockerfile中应用多个两头镜像来轻松优化Docker镜像。在此处理解更多信息。通过应用多阶段构建,咱们能够在构建镜像中装置所有依赖项,并将它们复制到精简运行时镜像中。

FROM node:10 AS BUILD_IMAGEWORKDIR /appCOPY . /appEXPOSE 8080RUN npm install && npm run buildFROM node:10WORKDIR /app# copy from build imageCOPY --from=BUILD_IMAGE /app/dist ./distCOPY --from=BUILD_IMAGE /app/node_modules ./node_modulesRUN npm i -g http-serverCMD 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_IMAGERUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/binWORKDIR /appCOPY . /appEXPOSE 8080RUN npm install && npm run build# remove development dependenciesRUN npm prune --production# run node pruneRUN /usr/local/bin/node-pruneFROM node:10WORKDIR /app# copy from build imageCOPY --from=BUILD_IMAGE /app/dist ./distCOPY --from=BUILD_IMAGE /app/node_modules ./node_modulesRUN npm i -g http-serverCMD http-server ./dist

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

3:抉择较小的最终根底镜像

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

这里咱们将应用 alpine 镜像; alpine是一个精简的docker镜像,具备起码的软件包,但足以运行节点应用程序。

FROM node:10 AS BUILD_IMAGERUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/binWORKDIR /appCOPY . /appEXPOSE 8080RUN npm install && npm run build# remove development dependenciesRUN npm prune --production# run node pruneRUN /usr/local/bin/node-pruneFROM node:10-alpineWORKDIR /app# copy from build imageCOPY --from=BUILD_IMAGE /app/dist ./distCOPY --from=BUILD_IMAGE /app/node_modules ./node_modulesRUN npm i -g http-serverCMD http-server ./dist

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

论断

通过利用这3个简略步骤,咱们将docker镜像大小减小了10倍。

PS: 本文属于翻译,原文