news 2026/10/21 8:17:35

Docker 镜像瘦身术:如何把 Spring Boot 镜像从 500MB 优化到 80MB?(多阶段构建实战)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker 镜像瘦身术:如何把 Spring Boot 镜像从 500MB 优化到 80MB?(多阶段构建实战)

🐘 前言:为什么你的镜像那么“胖”?

很多 Java 开发者的Dockerfile是这样写的:

# ❌ 错误示范:直接用完整的 JDK 镜像 FROM openjdk:17 COPY target/my-app.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]

打完包一看:580MB。
为什么?因为你打包了:

  1. 完整的 JDK(javac, jdb 等开发工具,生产环境根本不需要)。
  2. 笨重的 OS(Debian/Ubuntu,包含大量无用库)。
  3. Maven 缓存(如果你在镜像里执行了 mvn package)。

今天,我们用三个步骤,把这个数字变成80MB。


🔪 第一刀:换个“底座” (JRE vs JDK)

生产环境只需要运行 Java 程序,不需要编译它。
所以,请把JDK换成JRE(Java Runtime Environment)。
更进一步,把操作系统从Debian换成Alpine Linux(一个只有 5MB 大小的 Linux 发行版)。

  • OpenJDK 17 (Debian): ~400MB
  • Eclipse-Temurin 17 JRE (Alpine): ~50MB

仅仅换个 Base Image,体积就减小了 350MB!


🏗️ 第二刀:多阶段构建 (Multi-stage Builds)

这是 Docker 的杀手锏。
想象一下做饭:

  • 阶段一(厨房):锅碗瓢盆、油烟机、案板(Maven, JDK, 源码)。乱糟糟的。
  • 阶段二(餐厅):只有一盘做好的菜(Jar 包)和一副餐具(JRE)。干干净净。

我们只把“餐厅”打包给用户。

原理流程图:

阶段二: 运行环境 (Runner)
阶段一: 编译环境 (Builder)
COPY --from=builder
Alpine JRE (极简 OS)
最终镜像
Maven 构建工具
Java 源码
生成 JAR 包

🚀 终极实战:完美 Dockerfile 模板

结合多阶段构建+Alpine JRE+分层构建 (Layered Jar),这是目前 Spring Boot 的最佳实践。

新建Dockerfile:

# ============================ # 阶段 1: 编译构建 (Builder) # ============================ FROM maven:3.9-eclipse-temurin-17-alpine AS builder WORKDIR /build # 1. 单独拷贝 pom.xml 利用 Docker 缓存,避免每次都重新下载依赖 COPY pom.xml . # 预下载依赖 (这一步极大加速后续构建) RUN mvn dependency:go-offline # 2. 拷贝源码并打包 COPY src ./src RUN mvn clean package -DskipTests # 3. 提取 Spring Boot 分层 (为了更好的缓存支持) # 需要在 pom.xml 开启 layers 配置,或者直接用 java -Djarmode=layertools RUN java -Djarmode=layertools -jar target/*.jar extract # ============================ # 阶段 2: 生产运行 (Runner) # ============================ FROM eclipse-temurin:17-jre-alpine WORKDIR /app # 1. 也是分层 COPY,这样如果只是改了代码,依赖层(dependencies)不需要重新传输 COPY --from=builder /build/dependencies/ ./ COPY --from=builder /build/spring-boot-loader/ ./ COPY --from=builder /build/snapshot-dependencies/ ./ COPY --from=builder /build/application/ ./ # 2. 解决 Alpine 字体缺失问题 (验证码图片可能会用到) RUN apk add --no-cache fontconfig ttf-dejavu # 3. 启动命令 (使用 JarLauncher) ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]

📊 效果对比:瘦身成绩单

我们来对比一下三种构建方式的最终镜像大小:

xychart-beta title "Docker 镜像大小对比 (MB)" x-axis ["原始方案 (JDK+Debian)", "仅换 Base (JRE+Alpine)", "多阶段构建 (最终版)"] y-axis "镜像体积 (MB)" 0 --> 600 bar [580, 150, 85]
  • 原始方案:580MB。包含完整的 OS 和 JDK,传输慢,安全漏洞多。
  • 最终方案:85MB。极致精简,秒级拉取,攻击面极小。

📝 总结

做镜像优化不仅仅是为了“省空间”,更是为了:

  1. 更快的发布速度:80MB 的镜像推送到阿里云/AWS 仓库只需要几秒钟。
  2. 更强的安全性:Distroless 或 Alpine 去除了 curl、wget 等工具,黑客进来了也难以下载脚本。
  3. 更低的成本:云厂商的镜像仓库存储和流量都是要钱的。

记住口诀:编译用 JDK,运行用 JRE,构建分阶段,底座选 Alpine。


博主留言:
你的镜像现在有多大?有没有遇到过Alpine 里的时区不对或者DNS 解析慢的坑?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 0:44:48

毕设救星:Spring Boot + Neo4j 打造“医疗知识问答”——基于知识图谱的智能导诊平台

🏥 前言:为什么选“医疗问答”? 现在毕设题目里带个“智能”二字才好过。但真正的“医疗大模型”训练成本极高,且容易胡说八道。 “基于知识图谱的问答 (KBQA)” 是完美的替代方案: 准确性高:基于图谱查询,不会产生幻觉(医生说吃药 A,它绝不会说吃药 B)。 可视化强…

作者头像 李华
网站建设 2026/10/20 17:32:44

华为网络设备基本配置命令

1、恢复出出厂设置<Huawei>reset saved-configuration This will delete the configuration in the flash memory.The device configuratio ns will be erased to reconfigure.Are you sure? (y/n)[n]:yClear the configuration in the device successfully. <Huawe…

作者头像 李华
网站建设 2026/10/20 22:47:53

志同道合交友网站毕业论文+PPT(附源代码+演示视频)

文章目录志同道合交友网站一、项目简介&#xff08;源代码在文末&#xff09;1.运行视频2.&#x1f680; 项目技术栈3.✅ 环境要求说明4.包含的文件列表&#xff08;含论文&#xff09;数据库结构与测试用例系统功能结构后台运行截图项目部署源码下载志同道合交友网站 如需其他…

作者头像 李华
网站建设 2026/10/21 10:42:06

【Java 25 LTS六大核心特性】

Java 25 LTS 深度拆解&#xff1a;改变开发范式的六大核心特性 基本类型模式匹配&#xff08;JEP 507&#xff09; 模式匹配简化了类型检查和转换&#xff0c;减少冗余代码。例如&#xff1a; if (obj instanceof String s) { System.out.println(s.toLowerCase()); } 基…

作者头像 李华
网站建设 2026/10/20 22:42:15

Langchain-Chatchat助力医疗文档智能检索与问答

Langchain-Chatchat助力医疗文档智能检索与问答 在一家三甲医院的早交班会议上&#xff0c;一位年轻医生急切地翻找《KDIGO慢性肾病临床实践指南》第47页的内容——关于三期患者使用ACEI类药物的禁忌证。他花了七分钟才从PDF目录中定位到相关章节。而就在同一时刻&#xff0c;…

作者头像 李华
网站建设 2026/10/19 21:49:28

Langchain-Chatchat如何实现文档相似度比对?查重与去重依据

Langchain-Chatchat 如何实现文档相似度比对&#xff1f;查重与去重依据 在企业知识库日益膨胀的今天&#xff0c;一个看似简单却影响深远的问题浮出水面&#xff1a;为什么我上传了十份几乎一模一样的项目报告&#xff0c;系统还在一遍遍地索引、存储、检索&#xff1f; 这不仅…

作者头像 李华