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