对应用程序进行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: 本文属于翻译,原文