← 中文资源

简体中文版本

用多阶段 Dockerfile 构建更小的镜像

用多阶段构建在编译阶段完成构建,只把运行时产物复制到最终小镜像;这种模式常能把镜像缩小十倍以上。

阅读英文原文

为什么使用多阶段构建

单阶段 Dockerfile 把源码、构建工具、开发依赖和缓存文件全部塞进一个镜像,带来更大的攻击面,并在部署时浪费带宽。

多阶段构建让构建工具留在一个阶段,只把构建产物复制进干净、精简的生产阶段。

多阶段如何工作

每条 FROM 指令开始一个新阶段。可以用名称(AS builder)或索引(--from=0)引用早期阶段。只有最后一个阶段进入最终镜像,除非用 --target 指定其他阶段。

缓存挂载加速构建

使用 BuildKit 缓存挂载在多次构建间保留 npm 缓存:

RUN --mount=type=cache,target=/root/.npm \
    npm ci --include=dev

验证镜像

预期结果:最终镜像不包含源码、编译器和开发依赖,但应用可以启动并通过健康检查。用 docker history 和 docker run 确认层内容与运行行为,并比较优化前后的镜像大小。