优化Spring Boot镜像 🚀

优化Spring Boot镜像,让它更小更快 🚀

在上一篇博客里,我们学习了如何将Spring Boot项目打包成Docker镜像 (打包Spring Boot应用到Docker镜像)。不过,默认构建出来的镜像有点太大啦,启动速度也不太理想。今天咱们就来学习几个小技巧,让镜像变小变快吧!

使用更小的基础镜像 🐳

之前我们使用的是eclipse-temurin:17-jre作为基础镜像,它包含了完整的Java运行环境。不过对于运行时环境来说,我们完全可以选择更小的基础镜像,比如eclipse-temurin:17-jre-alpine

Alpine是一个面向安全应用的超级小型Linux发行版,可以大大减小镜像的体积哦。我们只需要将Dockerfile中的第一行修改为:

FROM eclipse-temurin:17-jre-alpine

就这么简单!

优化Spring Boot镜像 🚀

Spring Boot有个非常赞的分层打包功能,可以将应用分成不同的层,包括依赖层、Spring Boot加载器层、快照依赖层和应用层等。这样一来,在构建Docker镜像时,我们就可以只复制需要的层,从而减小镜像体积了。

java -Djarmode=layertools -jar application.jar extract

当执行命令时,Spring Boot将解压可执行jar包,并将上述四个层分别解压到以下目录:

  • /dependencies/
  • /spring-boot-loader/
  • /snapshot-dependencies/
  • /application/

多层构建优化 🧱

多层构建(multi-stage build)是另一个强大的优化技巧。这种方法巧妙地利用不同构建阶段的特性,大幅精简最终镜像体积。

具体步骤如下:

  1. 构建阶段: 使用功能完备的基础镜像,解压并处理Spring Boot的可执行jar包。
  2. 运行时阶段: 选用轻量级基础镜像,仅复制必要的应用文件。

这种”分而治之”的策略不仅能显著减小镜像体积,还能提升构建效率和应用性能。通过将构建过程与运行环境分离,我们可以在不影响最终镜像大小的情况下,充分利用构建阶段的各种工具和资源。

# 构建镜像
FROM eclipse-temurin:17-jre as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract

# 运行时镜像
FROM eclipse-temurin:17-jre
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
EXPOSE 8080
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/urandom", "org.springframework.boot.loader.JarLauncher"]

在构建镜像阶段,我们使用了eclipse-temurin:17-jre作为基础镜像。在运行时镜像阶段,我们切换到更小的eclipse-temurin:17-jre-alpine,只复制构建好的JAR包,并设置了启动命令。最后,我们还添加了一个java.security.egd的系统属性,以防JVM在启动时出现延迟 🐢
使用这些优化技巧,我们就能构建出体积小巧、启动超快的Spring Boot镜像了!赶紧试试看吧 🚀

其他优化建议 💡

除了上述几种优化技巧之外,我们还可以考虑以下一些优化:

  • 启用Docker层缓存,加速镜像构建速度
  • 使用.dockerignore排除不需要的文件
  • 合理设置Java内存参数,防止内存不足
  • 开启GC日志,以便排查内存问题

优化Spring Boot镜像 🚀
https://coding.gs/2024/05/19/springboot-image2/
作者
K
发布于
2024年5月19日
许可协议