在构建 Spring Boot 应用的 Docker 镜像时,推荐选择 eclipse-temurin(原 AdoptOpenJDK)的官方 OpenJDK 镜像,具体为:
✅ 首选镜像(推荐):
FROM eclipse-temurin:17-jre-jammy # JDK 17 + JRE-only + Ubuntu 22.04 (jammy)
# 或更轻量的 Debian 版本(生产推荐):
FROM eclipse-temurin:17-jre-focal # JDK 17 + JRE-only + Ubuntu 20.04(更小、稳定)
# 或 Alpine(需谨慎,见下文说明):
FROM eclipse-temurin:17-jre-alpine # 更小体积,但注意 glibc 兼容性
✅ 推荐理由(关键考量):
| 维度 | 说明 |
|---|---|
| 长期支持(LTS) | Spring Boot 3.x 要求 Java 17+(官方最低要求),且 Java 17 是当前主流 LTS 版本(支持至 2029),比 Java 21(LTS)更成熟稳定。Spring Boot 3.2+ 已支持 Java 21,但生产环境仍建议优先选 Java 17。 |
| 安全与维护 | eclipse-temurin 是 Eclipse 基金会托管的、由 IBM/Red Hat/Amazon 等共同维护的 生产级、合规、定期更新 的 OpenJDK 发行版,替代了已归档的 openjdk 官方镜像(Docker Hub 上的 openjdk 镜像自 2023 年起已标记为 deprecated)。 |
| 镜像大小与性能 | 使用 -jre(非 -jdk)后缀:仅含 JRE(运行时),不含编译器/调试工具等,体积更小、攻击面更小、启动更快 —— 构建 Spring Boot 镜像时通常只需运行应用,无需编译。 |
| OS 基础层选择 |
|
⚠️ 不推荐的镜像(常见误区):
| 镜像 | 问题 |
|---|---|
openjdk:17-jre-slim(Docker Hub 官方 openjdk) |
❌ 已被标记为 deprecated,不再维护,存在安全风险;官方明确推荐迁移到 eclipse-temurin。 |
amazoncorretto:17-jre-alpine 或 zulu:17-jre-alpine |
⚠️ Alpine 可能引发兼容性问题(尤其使用 Spring Native、GraalVM、JNA、某些 JDBC 驱动时),需严格验证;Corretto/Zulu 虽可靠,但 eclipse-temurin 社区更开放、更新更及时。 |
java:17-jre(旧别名) |
❌ 过时标签,实际指向已废弃的 openjdk 镜像。 |
JDK 镜像(如 ...-jdk-...) |
❌ 除非需要运行 javac/jstack 等工具(如调试场景),否则纯运行时用 JRE 即可,减少体积和漏洞面。 |
✅ 最佳实践 Dockerfile 示例(Spring Boot 3.x):
# 使用多阶段构建(推荐)
FROM eclipse-temurin:17-jre-focal AS runtime
# 创建非 root 用户(安全最佳实践)
RUN addgroup -g 1001 -f spring && adduser -S spring -u 1001
# 复制 fat jar(假设 build 后生成 target/myapp.jar)
ARG JAR_FILE=target/myapp.jar
COPY ${JAR_FILE} app.jar
# 暴露端口
EXPOSE 8080
# 设置运行用户
USER spring:spring
# 启动命令(禁用 JMX 等非必要功能,提升安全性)
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
🔍 补充建议:
- ✅ 版本锁定:始终使用精确版本标签(如
17.0.10_7-jre-focal),避免17-jre-focal这类浮动标签导致不可重现构建。 - ✅ 扫描安全漏洞:用
trivy,grype或 CI 集成扫描基础镜像。 - ✅ Spring Boot 3.3+ 用户:可考虑
eclipse-temurin:21-jre-focal(Java 21 LTS),但需确认所有依赖兼容(尤其是 JVM Agent、监控 SDK)。
✅ 总结一句话答案:
选用
eclipse-temurin:<JAVA_VERSION>-jre-<OS_VARIANT>(如17-jre-focal),优先focal/jammy(Ubuntu)而非 Alpine,并确保使用精确版本号,禁用 root 运行,这是当前最安全、轻量、符合 Spring Boot 官方推荐的 Java 基础镜像方案。
如需我帮你生成完整可运行的 Dockerfile(含 Maven 构建阶段、分层缓存优化、健康检查等),欢迎提供你的 Spring Boot 版本和打包方式(fat jar / layered jar / jlink) 😊
CLOUD云枢