多阶段构建可将微服务镜像从几百MB压缩至几十MB;核心是“做减法”,仅保留运行必需文件,分阶段选用轻量基础镜像(如node:18-alpine),严格分离构建与运行内容,清理中间产物,并配合.dockerignore从源头过滤冗余文件。

直接用多阶段构建,能把微服务镜像从几百MB压到几十MB,存储成本自然大幅下降。核心不是“加功能”,而是“做减法”——只保留运行必需的文件,把构建工具、开发依赖、源码缓存全留在上一阶段。
选对基础镜像,起点就轻
第一阶段可用完整版 Node 镜像(如 node:18)保证构建兼容性;第二阶段必须切到轻量基础镜像,比如:
- node:18-alpine(约 50MB),适合大多数 Express 或 NestJS 微服务
- node:18-slim(约 250MB),若 Alpine 上有原生模块兼容问题可作备选
- 极端精简场景可考虑 scratch + 静态编译产物(需应用本身支持)
分清构建与运行,不带一粒沙
构建阶段负责装依赖、跑编译、生成 dist;运行阶段只复制三样东西:
- package.json 和 yarn.lock(用于安装生产依赖)
- node_modules(或仅用 npm install --only=production 重装)
- 构建输出目录(如 dist/ 或 build/),不复制 src/.git/.env 等
避免 COPY . . 这类粗放操作,否则源码、测试、文档全进镜像,白占几十MB。
清理中间产物,防止层体积膨胀
即使用了多阶段,RUN 指令里没清理也会留下冗余数据。常见要清理的包括:
- npm/yarn 缓存:npm cache clean --force 或 yarn cache clean
- 构建临时文件:rm -rf .next .nuxt coverage(按框架调整)
- 系统包缓存(Alpine):apk --no-cache add ... && rm -rf /var/cache/apk/*
配合 .dockerignore,从源头过滤
这个文件比 Dockerfile 更早起作用。务必加入:
- .git、node_modules(本地开发用,不参与构建)
- logs、tmp、test、docs
- .env.local、secrets/(安全和体积双保险)
它能阻止这些文件被送入构建上下文,避免无意义地增大每一层。
不复杂但容易忽略


















