两个阶段,一个镜像
多阶段构建用重镜像编译、用瘦镜像运行。只有 COPY –from=build 指定的产物进入最终镜像,工具链、开发依赖和源码都不会进入仓库。
FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-slim AS runtime
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]
度量收益
构建两种变体并对比。体积通常下降一个数量级,拉取更快、部署更快、仓库不再膨胀。
docker build -t app:multistage .
docker images app --format "{{.Size}}"
预期结果
多阶段镜像低于 150 MB,部署拉取以秒计,运行阶段不含源码或开发依赖。若原生模块缺失,应在运行阶段安装而非拷贝整个构建树。slim 基础若缺 ca-certificates 会影响 TLS,需显式补上。