6月3日 00:02
Docker 多阶段构建怎么用?减小镜像体积的最佳方法
多阶段构建让 Dockerfile 分多个阶段——编译阶段用完整环境构建产物,运行阶段只拷贝最终产物。结果:镜像从 1GB+ 缩小到 50MB 以下。
问题:单阶段构建镜像太大
node:20 镜像 1.1GB,加上 node_modules 几百 MB,最终镜像可能 1.5GB。但运行时只需要 dist/ 目录和 node 生产依赖。
多阶段构建
--from=builder 从第一阶段拷贝指定目录。node:20-slim 只有 200MB,最终镜像约 300MB——比单阶段小 5 倍。
Go 应用:极致压缩
Go 编译出单个二进制文件,运行时不需要 Go 环境:
scratch 是空镜像——里面只有你拷贝的二进制文件。最终镜像可能只有 10-20MB。
前端应用:Nginx 托管静态文件
前端只需要构建后的 HTML/CSS/JS,不需要 node_modules。nginx:alpine 只有 25MB。
COPY --from 的其他用法
不限于同一 Dockerfile 的阶段,可以从其他镜像拷贝:
从 Caddy 官方镜像里只拷贝二进制文件,不用自己安装。
关键要点
- 每个 FROM 开始一个新阶段,只有最后一个阶段的产物进入最终镜像
- 用 AS 命名阶段,COPY --from=名称 引用
- 运行阶段尽量用 slim/alpine 变体
- 不要把源码、编译工具、dev 依赖带进运行镜像