Tomcat Docker 官方镜像 JDK 与 JRE 变体揭秘:同一 Tomcat 为何体积能省一半?
【免费下载链接】tomcatDocker Official Image packaging for Apache Tomcat项目地址: https://gitcode.com/gh_mirrors/to/tomcat
Tomcat Docker 官方镜像仓库(Docker Official Image for Apache Tomcat)为 9.0、10.1、11.0 三个大版本各提供了一套JDK / JRE × 多个 Java 版本 × Temurin 基础系统的镜像组合。同一份 Tomcat,为什么 JRE 变体比 JDK 变体小了近一半?本文带你读透仓库里的构建脚本,搞懂这些变体是怎么生成、怎么选、怎么更新的。
🗂️ 先看家底:Tomcat Docker 官方镜像有哪些变体?
所有变体清单都记录在仓库根目录的versions.json中(当前收录 Tomcat 9.0.121 / 10.1.59 / 11.0.25):
| Tomcat 大版本 | 支持的 Java 版本 | 每个变体的 Java 形态 |
|---|---|---|
| 11.0(latest) | 17 / 21 / 25 | jdk、jre |
| 10.1 | 11 / 17 / 21 / 25 | jdk、jre |
| 9.0 | 8 / 11 / 17 / 21 / 25 | jdk、jre |
每个 Java 版本又对应两种 Temurin 基础系统:temurin-noble(Ubuntu 24.04)和temurin-jammy(Ubuntu 22.04),例如目录结构就是11.0/jre17/temurin-noble/Dockerfile这样的层级。
💡 为什么 Tomcat 11 没有 JDK 8?规则写在
shared.jq的is_supported_java_version里:Tomcat 11 要求 Java 17+、10.1 要求 Java 11+、9.0 支持 Java 8+,不满足的变体会在生成时被自动过滤掉。
🔍 核心揭秘:JRE 变体凭什么"省一半"?
答案藏在Dockerfile.template中——JDK 和 JRE 走了两条完全不同的构建路径:
1️⃣ JDK 变体:全量构建(重活都在这一步干完)
JDK 变体的 Dockerfile 会完成一整套"从源码到成品"的工作:
- 从 Apache 官方镜像下载 Tomcat 发行包,并做SHA512 校验 + GPG 签名验签;
- 移除默认 webapps,编译Tomcat Native(APR 加速库);
- 用
apt-mark+ 自动清理机制删掉所有构建依赖(gcc、make 等),避免"构建工具残留"撑大镜像; - 最后跑
catalina.sh version冒烟测试。
2️⃣ JRE 变体:零构建,直接"搬家"
JRE 变体的构建核心只有两行思路(见11.0/jre17/temurin-noble/Dockerfile):
COPY --from=tomcat:11.0.25-jdk17-temurin-noble:直接把同名 JDK 变体里已构建好的 Tomcat 整个复制过来;- 基础镜像换成更小的
eclipse-temurin:17-jre-noble,再按.dependencies.txt补装 Tomcat Native 运行时所需的最小依赖库; - 同样执行
catalina.sh configtest验证 Native 库加载成功。
体积能省一半的秘密就在这:JDK 镜像里包含编译器(javac)、完整开发工具链,而 JRE 镜像只有运行期需要的类库。JRE 变体把"构建"完全复用给了 JDK 变体,自己只负责"换底座 + 搬成品",于是同一份 Tomcat 文件,JRE 镜像整体小了一圈,拉取也更快。
🏷️ 实战指南:如何选对 Tomcat Docker 镜像标签?
镜像标签由generate-stackbrew-library.sh自动生成,常见标签规律如下:
tomcat:11-jre17-temurin-noble→ Tomcat 11 + Java 17 JRE + Ubuntu 24.04 底座;tomcat:11/tomcat:latest→ 默认变体(当前最新 temurin-noble 组合);- 省略厂商名时默认指向 Temurin 变体,如
tomcat:9-jdk8即jdk8/temurin-noble。
选型建议清单✅:
| 场景 | 推荐选择 | 理由 |
|---|---|---|
| 生产部署 | jre+ 长期支持 Java 版本(如 17/21) | 体积更小、攻击面更小 |
| 需要运行时编译 JSP | jdk变体 | Jasper 编译 JSP 依赖 javac |
| 需要最新 Servlet 6.1 规范 | Tomcat 11(11-jre21-...) | 11 只支持 Java 17+ |
| 兼容老旧项目 | 9-jre8 | 9.0 是仍支持 Java 8 的版本线 |
🛠️ 自动化更新:镜像是怎么保鲜的?
整个更新流程由update.sh一键串联,分两步:
versions.sh:从 Apache 官方下载页抓取各大版本的最新稳定版(自动跳过 -M 里程碑版本)及其 SHA512,再结合from.jq把变体名(如jre17/temurin-noble)映射为eclipse-temurin:17-jre-noble基础镜像,确认该基础镜像在官方镜像库中真实存在后,写回versions.json;apply-templates.sh:读取versions.json,用Dockerfile.template+from.jq+shared.jq为每个"版本 × 变体"组合生成独立的Dockerfile(所以每个生成文件顶部都写着"请勿直接编辑")。
也就是说:你看到的每一个子目录 Dockerfile 都是模板产物,改模板(Dockerfile.template)才是正解。
📌 一句话总结
Tomcat Docker 官方镜像的"瘦身"不是删了什么,而是构建与运行分离:JDK 变体承担全部构建工作,JRE 变体直接复用其成果并换上更轻的 JRE 底座——生产环境优先选 JRE 变体,需要运行时编译能力时再切回 JDK 变体即可。
【免费下载链接】tomcatDocker Official Image packaging for Apache Tomcat项目地址: https://gitcode.com/gh_mirrors/to/tomcat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考