为什么使用多阶段构建
单阶段 Dockerfile 把源码、构建工具、开发依赖和缓存文件全部塞进一个镜像,带来更大的攻击面,并在部署时浪费带宽。
多阶段构建让构建工具留在一个阶段,只把构建产物复制进干净、精简的生产阶段。
多阶段如何工作
每条 FROM 指令开始一个新阶段。可以用名称(AS builder)或索引(--from=0)引用早期阶段。只有最后一个阶段进入最终镜像,除非用 --target 指定其他阶段。
缓存挂载加速构建
使用 BuildKit 缓存挂载在多次构建间保留 npm 缓存:
RUN --mount=type=cache,target=/root/.npm \
npm ci --include=dev
验证镜像
预期结果:最终镜像不包含源码、编译器和开发依赖,但应用可以启动并通过健康检查。用 docker history 和 docker run 确认层内容与运行行为,并比较优化前后的镜像大小。