如何将Node.js Docker镜像大小减少10倍

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

为何镜像大小很重要

  • 较大的docker镜像须要更多空间,这意味着增长费用。
  • 较长的构建时间-将镜像经过网络推送会花费更长的时间,并致使CI管道延迟。

让咱们开始优化

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

这是初始的Dockerfile。github

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:docker

让咱们开始逐步优化。npm

1:使用多阶段Docker构建安全

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

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:markdown

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

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

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

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: 本文属于翻译,原文

相关文章
相关标签/搜索