Docker 最小化基础镜像构建深度解析
在 Java 微服务的容器化交付中,基础镜像的大小直接影响拉取速度、磁盘占用、攻击面和维护成本。构建最小化的基础镜像是生产级 Dockerfile 设计的核心原则之一。这并非简单选择一个小镜像,而是涉及依赖裁剪、运行时精简、安全加固和兼容性权衡的系统工程。
一、为什么追求最小化镜像?
| 分发效率 | 更小的镜像体积意味着更快的 Registry 推送/拉取,加速 CI/CD 和弹性伸缩 |
| 安全攻击面 | 去掉 Shell、包管理器、工具链等非必要组件,减少 CVE 漏洞和潜在利用工具 |
| 存储成本 | 减少 Registry 和节点磁盘占用,降低基础设施开销 |
| 启动速度 | 更少的层和文件数,镜像提取速度更快(尤其在冷启动场景) |
| 维护性 | 精准控制软件供应链,移除无关的库和文件,降低升级复杂度 |
二、常见最小化基础镜像对比
| Scratch | 0 MB | 完全空白的镜像,不含任何文件系统、Shell 或工具 | 静态编译的二进制程序(如 Go),不适用于标准 Java 应用(需要 JDK/JRE 环境) |
| Alpine Linux | ~5 MB | 基于 musl libc 和 BusyBox,包管理用 apk;体积小但兼容性需要验证 | Java 应用可行,但需注意 musl 与 glibc 的差异(可能影响 JNI、信号处理) |
| Distroless | ~2 MB(基础) | Google 维护,仅包含运行特定语言所需的最小文件(如 JRE),无 Shell、包管理器 | Java 应用的最佳选择:安全、精炼,强制性非 root |
| Distroless Java | ~120 MB | 包含 AdoptOpenJDK JRE 或 Temurin JRE,无操作系统工具 | Spring Boot 等 JVM 应用 |
| Distroless Java11/17 | ~120 MB | 特定 JDK 版本的 JRE | 生产级 Java 微服务推荐 |
| Slim (Debian-based) | ~30 MB(slim) | 基于完整 Debian,裁剪了文档、调试符号等;保留 apt,但安全于标准镜像 | 需要调试或安装额外库时 |
Java 生产最佳实践:优先使用 Distroless 作为运行时镜像,彻底移除 Shell 和包管理器,攻击面最小。开发期间可使用 Alpine 或 Slim 方便调试,但最终发布应切换到 Distroless。
三、构建最小化镜像的核心策略
实现最小化不仅仅依赖选择小镜像,还需要从构建全流程进行优化:
3.1 多阶段构建:分离构建环境与运行环境
这是最重要的技术。在构建阶段使用包含完整 JDK、Maven/Gradle 的“重”镜像,编译打包应用;在运行阶段仅复制产物(JAR)到精简的 JRE 镜像中。
#mermaid-svg-rRpeqJIu5MwEqR1C{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rRpeqJIu5MwEqR1C .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rRpeqJIu5MwEqR1C .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rRpeqJIu5MwEqR1C .error-icon{fill:#552222;}#mermaid-svg-rRpeqJIu5MwEqR1C .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rRpeqJIu5MwEqR1C .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rRpeqJIu5MwEqR1C .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rRpeqJIu5MwEqR1C .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rRpeqJIu5MwEqR1C .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rRpeqJIu5MwEqR1C .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rRpeqJIu5MwEqR1C .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rRpeqJIu5MwEqR1C .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rRpeqJIu5MwEqR1C .marker.cross{stroke:#333333;}#mermaid-svg-rRpeqJIu5MwEqR1C svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rRpeqJIu5MwEqR1C p{margin:0;}#mermaid-svg-rRpeqJIu5MwEqR1C .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-rRpeqJIu5MwEqR1C .cluster-label text{fill:#333;}#mermaid-svg-rRpeqJIu5MwEqR1C .cluster-label span{color:#333;}#mermaid-svg-rRpeqJIu5MwEqR1C .cluster-label span p{background-color:transparent;}#mermaid-svg-rRpeqJIu5MwEqR1C .label text,#mermaid-svg-rRpeqJIu5MwEqR1C span{fill:#333;color:#333;}#mermaid-svg-rRpeqJIu5MwEqR1C .node rect,#mermaid-svg-rRpeqJIu5MwEqR1C .node circle,#mermaid-svg-rRpeqJIu5MwEqR1C .node ellipse,#mermaid-svg-rRpeqJIu5MwEqR1C .node polygon,#mermaid-svg-rRpeqJIu5MwEqR1C .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rRpeqJIu5MwEqR1C .rough-node .label text,#mermaid-svg-rRpeqJIu5MwEqR1C .node .label text,#mermaid-svg-rRpeqJIu5MwEqR1C .image-shape .label,#mermaid-svg-rRpeqJIu5MwEqR1C .icon-shape .label{text-anchor:middle;}#mermaid-svg-rRpeqJIu5MwEqR1C .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rRpeqJIu5MwEqR1C .rough-node .label,#mermaid-svg-rRpeqJIu5MwEqR1C .node .label,#mermaid-svg-rRpeqJIu5MwEqR1C .image-shape .label,#mermaid-svg-rRpeqJIu5MwEqR1C .icon-shape .label{text-align:center;}#mermaid-svg-rRpeqJIu5MwEqR1C .node.clickable{cursor:pointer;}#mermaid-svg-rRpeqJIu5MwEqR1C .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rRpeqJIu5MwEqR1C .arrowheadPath{fill:#333333;}#mermaid-svg-rRpeqJIu5MwEqR1C .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rRpeqJIu5MwEqR1C .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rRpeqJIu5MwEqR1C .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rRpeqJIu5MwEqR1C .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rRpeqJIu5MwEqR1C .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rRpeqJIu5MwEqR1C .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rRpeqJIu5MwEqR1C .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rRpeqJIu5MwEqR1C .cluster text{fill:#333;}#mermaid-svg-rRpeqJIu5MwEqR1C .cluster span{color:#333;}#mermaid-svg-rRpeqJIu5MwEqR1C div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rRpeqJIu5MwEqR1C .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rRpeqJIu5MwEqR1C rect.text{fill:none;stroke-width:0;}#mermaid-svg-rRpeqJIu5MwEqR1C .icon-shape,#mermaid-svg-rRpeqJIu5MwEqR1C .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rRpeqJIu5MwEqR1C .icon-shape p,#mermaid-svg-rRpeqJIu5MwEqR1C .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rRpeqJIu5MwEqR1C .icon-shape .label rect,#mermaid-svg-rRpeqJIu5MwEqR1C .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rRpeqJIu5MwEqR1C .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rRpeqJIu5MwEqR1C .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rRpeqJIu5MwEqR1C :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
运行阶段 (runtime)
构建阶段 (builder)
COPY –from=builder
完整 JDK + Maven 镜像
编译并打包 JAR
Distroless Java 镜像
仅包含 JRE + 应用 JAR
收益:
- 最终镜像不包含 JDK、Maven 缓存、源码等,体积减少 60%~80%。
- 减少攻击面:没有编译工具链,无法在容器内编译恶意代码。
3.2 依赖与源码分离,利用缓存
在 Dockerfile 中先复制依赖描述文件(如 pom.xml),下载依赖,之后再复制源代码。利用 Docker 构建缓存,依赖层不变时可直接复用。
效果:加速构建,同时确保依赖仅存在于构建阶段。
3.3 使用 jlink(Java 11+)自定义 JRE
如果应用不需要完整的 JDK 或 JRE,可以使用 jlink 根据实际用到的模块生成定制的运行时镜像,去除 AWT、Swing 等不需要的模块,可将 Java 运行时缩小到 30-50 MB。
流程图:
#mermaid-svg-3tPz1MbRgb8D0MUY{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3tPz1MbRgb8D0MUY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3tPz1MbRgb8D0MUY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3tPz1MbRgb8D0MUY .error-icon{fill:#552222;}#mermaid-svg-3tPz1MbRgb8D0MUY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3tPz1MbRgb8D0MUY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3tPz1MbRgb8D0MUY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3tPz1MbRgb8D0MUY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3tPz1MbRgb8D0MUY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3tPz1MbRgb8D0MUY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3tPz1MbRgb8D0MUY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3tPz1MbRgb8D0MUY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3tPz1MbRgb8D0MUY .marker.cross{stroke:#333333;}#mermaid-svg-3tPz1MbRgb8D0MUY svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3tPz1MbRgb8D0MUY p{margin:0;}#mermaid-svg-3tPz1MbRgb8D0MUY .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-3tPz1MbRgb8D0MUY .cluster-label text{fill:#333;}#mermaid-svg-3tPz1MbRgb8D0MUY .cluster-label span{color:#333;}#mermaid-svg-3tPz1MbRgb8D0MUY .cluster-label span p{background-color:transparent;}#mermaid-svg-3tPz1MbRgb8D0MUY .label text,#mermaid-svg-3tPz1MbRgb8D0MUY span{fill:#333;color:#333;}#mermaid-svg-3tPz1MbRgb8D0MUY .node rect,#mermaid-svg-3tPz1MbRgb8D0MUY .node circle,#mermaid-svg-3tPz1MbRgb8D0MUY .node ellipse,#mermaid-svg-3tPz1MbRgb8D0MUY .node polygon,#mermaid-svg-3tPz1MbRgb8D0MUY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3tPz1MbRgb8D0MUY .rough-node .label text,#mermaid-svg-3tPz1MbRgb8D0MUY .node .label text,#mermaid-svg-3tPz1MbRgb8D0MUY .image-shape .label,#mermaid-svg-3tPz1MbRgb8D0MUY .icon-shape .label{text-anchor:middle;}#mermaid-svg-3tPz1MbRgb8D0MUY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3tPz1MbRgb8D0MUY .rough-node .label,#mermaid-svg-3tPz1MbRgb8D0MUY .node .label,#mermaid-svg-3tPz1MbRgb8D0MUY .image-shape .label,#mermaid-svg-3tPz1MbRgb8D0MUY .icon-shape .label{text-align:center;}#mermaid-svg-3tPz1MbRgb8D0MUY .node.clickable{cursor:pointer;}#mermaid-svg-3tPz1MbRgb8D0MUY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3tPz1MbRgb8D0MUY .arrowheadPath{fill:#333333;}#mermaid-svg-3tPz1MbRgb8D0MUY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3tPz1MbRgb8D0MUY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3tPz1MbRgb8D0MUY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3tPz1MbRgb8D0MUY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3tPz1MbRgb8D0MUY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3tPz1MbRgb8D0MUY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3tPz1MbRgb8D0MUY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3tPz1MbRgb8D0MUY .cluster text{fill:#333;}#mermaid-svg-3tPz1MbRgb8D0MUY .cluster span{color:#333;}#mermaid-svg-3tPz1MbRgb8D0MUY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3tPz1MbRgb8D0MUY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3tPz1MbRgb8D0MUY rect.text{fill:none;stroke-width:0;}#mermaid-svg-3tPz1MbRgb8D0MUY .icon-shape,#mermaid-svg-3tPz1MbRgb8D0MUY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3tPz1MbRgb8D0MUY .icon-shape p,#mermaid-svg-3tPz1MbRgb8D0MUY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3tPz1MbRgb8D0MUY .icon-shape .label rect,#mermaid-svg-3tPz1MbRgb8D0MUY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3tPz1MbRgb8D0MUY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3tPz1MbRgb8D0MUY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3tPz1MbRgb8D0MUY :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
应用代码
分析所需模块jdeps
使用 jlink 生成最小 JRE
与 JAR 打包到 Scratch 或 Distroless
注意:jlink 生成的运行时不含传统 JRE 的库目录结构,需要确保所有依赖均被显式声明,否则可能导致 ClassNotFoundException。
3.4 精简应用 JAR(Spring Boot Layering)
Spring Boot 2.3+ 支持分层 JAR(layers),将依赖库、应用类、资源等分离。Dockerfile 可分别复制这些层,利用缓存机制,并且可以更容易地移除快照依赖或不需要的资源。
分层打包示意图:
#mermaid-svg-RALTAMLi8Y13pLco{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RALTAMLi8Y13pLco .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RALTAMLi8Y13pLco .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RALTAMLi8Y13pLco .error-icon{fill:#552222;}#mermaid-svg-RALTAMLi8Y13pLco .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RALTAMLi8Y13pLco .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RALTAMLi8Y13pLco .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RALTAMLi8Y13pLco .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RALTAMLi8Y13pLco .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RALTAMLi8Y13pLco .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RALTAMLi8Y13pLco .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RALTAMLi8Y13pLco .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RALTAMLi8Y13pLco .marker.cross{stroke:#333333;}#mermaid-svg-RALTAMLi8Y13pLco svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RALTAMLi8Y13pLco p{margin:0;}#mermaid-svg-RALTAMLi8Y13pLco .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-RALTAMLi8Y13pLco .cluster-label text{fill:#333;}#mermaid-svg-RALTAMLi8Y13pLco .cluster-label span{color:#333;}#mermaid-svg-RALTAMLi8Y13pLco .cluster-label span p{background-color:transparent;}#mermaid-svg-RALTAMLi8Y13pLco .label text,#mermaid-svg-RALTAMLi8Y13pLco span{fill:#333;color:#333;}#mermaid-svg-RALTAMLi8Y13pLco .node rect,#mermaid-svg-RALTAMLi8Y13pLco .node circle,#mermaid-svg-RALTAMLi8Y13pLco .node ellipse,#mermaid-svg-RALTAMLi8Y13pLco .node polygon,#mermaid-svg-RALTAMLi8Y13pLco .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RALTAMLi8Y13pLco .rough-node .label text,#mermaid-svg-RALTAMLi8Y13pLco .node .label text,#mermaid-svg-RALTAMLi8Y13pLco .image-shape .label,#mermaid-svg-RALTAMLi8Y13pLco .icon-shape .label{text-anchor:middle;}#mermaid-svg-RALTAMLi8Y13pLco .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RALTAMLi8Y13pLco .rough-node .label,#mermaid-svg-RALTAMLi8Y13pLco .node .label,#mermaid-svg-RALTAMLi8Y13pLco .image-shape .label,#mermaid-svg-RALTAMLi8Y13pLco .icon-shape .label{text-align:center;}#mermaid-svg-RALTAMLi8Y13pLco .node.clickable{cursor:pointer;}#mermaid-svg-RALTAMLi8Y13pLco .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RALTAMLi8Y13pLco .arrowheadPath{fill:#333333;}#mermaid-svg-RALTAMLi8Y13pLco .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RALTAMLi8Y13pLco .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RALTAMLi8Y13pLco .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RALTAMLi8Y13pLco .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RALTAMLi8Y13pLco .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RALTAMLi8Y13pLco .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RALTAMLi8Y13pLco .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RALTAMLi8Y13pLco .cluster text{fill:#333;}#mermaid-svg-RALTAMLi8Y13pLco .cluster span{color:#333;}#mermaid-svg-RALTAMLi8Y13pLco div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RALTAMLi8Y13pLco .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RALTAMLi8Y13pLco rect.text{fill:none;stroke-width:0;}#mermaid-svg-RALTAMLi8Y13pLco .icon-shape,#mermaid-svg-RALTAMLi8Y13pLco .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RALTAMLi8Y13pLco .icon-shape p,#mermaid-svg-RALTAMLi8Y13pLco .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RALTAMLi8Y13pLco .icon-shape .label rect,#mermaid-svg-RALTAMLi8Y13pLco .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RALTAMLi8Y13pLco .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RALTAMLi8Y13pLco .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RALTAMLi8Y13pLco :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Spring Boot Fat JAR
解包分层
dependencies (外部依赖库)
spring-boot-loader (类加载器)
snapshot-dependencies (快照依赖)
application (应用类)
COPY 到容器,依赖变化极少,缓存率高
通过分层复制,当应用代码变动时,只需重建应用层,依赖层不变。
3.5 删除不必要的文件
在构建阶段完成打包后,删除 Maven 本地缓存、源码、临时文件等。使用 .dockerignore 排除 .git、target(如果从源码构建)、IDE 配置等,防止它们污染构建上下文。
四、针对 Java 应用的特殊考量
| JVM 兼容性 | Alpine 使用 musl libc,部分 JVM(如 Oracle HotSpot)依赖 glibc,可能导致信号处理、内存分配等问题 | 使用基于 glibc 的 Distroless Java 或 Temurin 的 Alpine 构建(Temurin 针对 musl 有优化) |
| JNI 与本地库 | 若应用依赖 JNI(如 Netty epoll),需确保本地库与基础镜像 C 库兼容 | 优先选择与构建环境 libc 一致的运行时,或静态链接 JNI 库 |
| Java 模块化 | Java 9+ 的模块系统可裁剪 JRE,去除不用的模块 | 使用 jlink 配合 jdeps 分析依赖,生成最小运行时 |
| 调试与监控 | Distroless 没有 Shell,无法 exec 进入容器;排查问题不便 | 开发环境保留 Shell,生产使用 Distroless;利用 JMX、Prometheus 暴露监控端点;日志输出到 stdout |
| 证书管理 | Distroless 可能缺少根证书,导致 HTTPS 调用失败 | 通过构建阶段复制证书文件到 Distroless 镜像(如从 Debian 镜像复制 /etc/ssl/certs) |
五、最佳实践决策树
#mermaid-svg-GK3vA3d8yf37c1a6{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GK3vA3d8yf37c1a6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GK3vA3d8yf37c1a6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GK3vA3d8yf37c1a6 .error-icon{fill:#552222;}#mermaid-svg-GK3vA3d8yf37c1a6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GK3vA3d8yf37c1a6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GK3vA3d8yf37c1a6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GK3vA3d8yf37c1a6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GK3vA3d8yf37c1a6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GK3vA3d8yf37c1a6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GK3vA3d8yf37c1a6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GK3vA3d8yf37c1a6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GK3vA3d8yf37c1a6 .marker.cross{stroke:#333333;}#mermaid-svg-GK3vA3d8yf37c1a6 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GK3vA3d8yf37c1a6 p{margin:0;}#mermaid-svg-GK3vA3d8yf37c1a6 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-GK3vA3d8yf37c1a6 .cluster-label text{fill:#333;}#mermaid-svg-GK3vA3d8yf37c1a6 .cluster-label span{color:#333;}#mermaid-svg-GK3vA3d8yf37c1a6 .cluster-label span p{background-color:transparent;}#mermaid-svg-GK3vA3d8yf37c1a6 .label text,#mermaid-svg-GK3vA3d8yf37c1a6 span{fill:#333;color:#333;}#mermaid-svg-GK3vA3d8yf37c1a6 .node rect,#mermaid-svg-GK3vA3d8yf37c1a6 .node circle,#mermaid-svg-GK3vA3d8yf37c1a6 .node ellipse,#mermaid-svg-GK3vA3d8yf37c1a6 .node polygon,#mermaid-svg-GK3vA3d8yf37c1a6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GK3vA3d8yf37c1a6 .rough-node .label text,#mermaid-svg-GK3vA3d8yf37c1a6 .node .label text,#mermaid-svg-GK3vA3d8yf37c1a6 .image-shape .label,#mermaid-svg-GK3vA3d8yf37c1a6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-GK3vA3d8yf37c1a6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GK3vA3d8yf37c1a6 .rough-node .label,#mermaid-svg-GK3vA3d8yf37c1a6 .node .label,#mermaid-svg-GK3vA3d8yf37c1a6 .image-shape .label,#mermaid-svg-GK3vA3d8yf37c1a6 .icon-shape .label{text-align:center;}#mermaid-svg-GK3vA3d8yf37c1a6 .node.clickable{cursor:pointer;}#mermaid-svg-GK3vA3d8yf37c1a6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GK3vA3d8yf37c1a6 .arrowheadPath{fill:#333333;}#mermaid-svg-GK3vA3d8yf37c1a6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GK3vA3d8yf37c1a6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GK3vA3d8yf37c1a6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GK3vA3d8yf37c1a6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GK3vA3d8yf37c1a6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GK3vA3d8yf37c1a6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GK3vA3d8yf37c1a6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GK3vA3d8yf37c1a6 .cluster text{fill:#333;}#mermaid-svg-GK3vA3d8yf37c1a6 .cluster span{color:#333;}#mermaid-svg-GK3vA3d8yf37c1a6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GK3vA3d8yf37c1a6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GK3vA3d8yf37c1a6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-GK3vA3d8yf37c1a6 .icon-shape,#mermaid-svg-GK3vA3d8yf37c1a6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GK3vA3d8yf37c1a6 .icon-shape p,#mermaid-svg-GK3vA3d8yf37c1a6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GK3vA3d8yf37c1a6 .icon-shape .label rect,#mermaid-svg-GK3vA3d8yf37c1a6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GK3vA3d8yf37c1a6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GK3vA3d8yf37c1a6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GK3vA3d8yf37c1a6 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
否
是
否
是
11+
8
选择基础镜像
是否需要 Shell 调试?
开发环境: Alpine 或 Slim
应用是否使用 JNI?
Distroless Java
JNI 库与 musl 兼容?
基于 glibc 的 Distroless 或 Debian Slim
Alpine + Temurin JRE
优化 JAR
启用 Spring Boot 分层
Java 版本?
使用 jlink 裁剪 JRE
无法使用 jlink
六、安全与合规
- Distroless 和 Alpine 通常都有官方定期维护的 CVE 数据库,应定期更新基础镜像版本。
- 使用 docker scan 或 Trivy 扫描镜像漏洞。
- 永远不要包含私钥、API Token 等敏感信息。
- 在非 Distroless 镜像中,确保以非 root 用户运行容器。
七、思维导图总结
#mermaid-svg-UTxEGfxraRDaJdDh{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UTxEGfxraRDaJdDh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UTxEGfxraRDaJdDh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UTxEGfxraRDaJdDh .error-icon{fill:#552222;}#mermaid-svg-UTxEGfxraRDaJdDh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UTxEGfxraRDaJdDh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UTxEGfxraRDaJdDh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UTxEGfxraRDaJdDh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UTxEGfxraRDaJdDh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UTxEGfxraRDaJdDh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UTxEGfxraRDaJdDh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UTxEGfxraRDaJdDh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UTxEGfxraRDaJdDh .marker.cross{stroke:#333333;}#mermaid-svg-UTxEGfxraRDaJdDh svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UTxEGfxraRDaJdDh p{margin:0;}#mermaid-svg-UTxEGfxraRDaJdDh .edge{stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .section–1 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section–1 path,#mermaid-svg-UTxEGfxraRDaJdDh .section–1 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section–1 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section–1 text{fill:#ffffff;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth–1{stroke-width:17;}#mermaid-svg-UTxEGfxraRDaJdDh .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-0 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-0 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-0 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-0 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-0 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-0{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-0{stroke-width:14;}#mermaid-svg-UTxEGfxraRDaJdDh .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-1 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-1 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-1 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-1 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-1 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-1{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-1{stroke-width:11;}#mermaid-svg-UTxEGfxraRDaJdDh .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-2 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-2 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-2 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-2 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-2 text{fill:#ffffff;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-2{stroke-width:8;}#mermaid-svg-UTxEGfxraRDaJdDh .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-3 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-3 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-3 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-3 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-3 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-3{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-3{stroke-width:5;}#mermaid-svg-UTxEGfxraRDaJdDh .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-4 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-4 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-4 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-4 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-4 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-4{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-4{stroke-width:2;}#mermaid-svg-UTxEGfxraRDaJdDh .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-5 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-5 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-5 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-5 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-5 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-5{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-5{stroke-width:-1;}#mermaid-svg-UTxEGfxraRDaJdDh .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-6 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-6 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-6 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-6 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-6 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-6{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-6{stroke-width:-4;}#mermaid-svg-UTxEGfxraRDaJdDh .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-7 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-7 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-7 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-7 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-7 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-7{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-7{stroke-width:-7;}#mermaid-svg-UTxEGfxraRDaJdDh .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-8 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-8 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-8 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-8 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-8 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-8{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-8{stroke-width:-10;}#mermaid-svg-UTxEGfxraRDaJdDh .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-9 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-9 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-9 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-9 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-9 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-9{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-9{stroke-width:-13;}#mermaid-svg-UTxEGfxraRDaJdDh .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-10 rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-10 path,#mermaid-svg-UTxEGfxraRDaJdDh .section-10 circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-10 polygon,#mermaid-svg-UTxEGfxraRDaJdDh .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-10 text{fill:black;}#mermaid-svg-UTxEGfxraRDaJdDh .node-icon-10{font-size:40px;color:black;}#mermaid-svg-UTxEGfxraRDaJdDh .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .edge-depth-10{stroke-width:-16;}#mermaid-svg-UTxEGfxraRDaJdDh .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled,#mermaid-svg-UTxEGfxraRDaJdDh .disabled circle,#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:lightgray;}#mermaid-svg-UTxEGfxraRDaJdDh .disabled text{fill:#efefef;}#mermaid-svg-UTxEGfxraRDaJdDh .section-root rect,#mermaid-svg-UTxEGfxraRDaJdDh .section-root path,#mermaid-svg-UTxEGfxraRDaJdDh .section-root circle,#mermaid-svg-UTxEGfxraRDaJdDh .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-UTxEGfxraRDaJdDh .section-root text{fill:#ffffff;}#mermaid-svg-UTxEGfxraRDaJdDh .section-root span{color:#ffffff;}#mermaid-svg-UTxEGfxraRDaJdDh .section-2 span{color:#ffffff;}#mermaid-svg-UTxEGfxraRDaJdDh .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-UTxEGfxraRDaJdDh .edge{fill:none;}#mermaid-svg-UTxEGfxraRDaJdDh .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-UTxEGfxraRDaJdDh :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
最小化基础镜像
动机
快速分发
安全加固
低成本存储
镜像类型
0 MB
~5 MB, musl
~2 MB, 无 Shell
~120 MB
Java 优化
多阶段构建
jlink 定制 JRE
Spring Boot 分层
依赖缓存利用
特殊问题
musl vs glibc
JNI 兼容性
调试缺失
根证书
决策
生产用 Distroless
JNI 注意 libc
jlink 需 Java 11+
通过上述理论与策略,可以系统性地回答如何为 Java 应用构建真正安全、高效、最小化的容器镜像,展现对 Docker 镜像优化和 Java 运行时的深度理解。



