对应用程序进行Docker化很是简单,有效,可是优化Docker Image的大小是棘手的部分。 Docker易于使用,可是一旦应用程序开始扩展,镜像大小就会呈指数增加。一般,大多数状况下,应用程序的Node.js docker镜像大小超过1 GB。node
这是使用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: 本文属于翻译,原文