Docker 镜像瘦身
Java 应用 Docker 镜像动辄 1GB+,拉取慢、占用大。多阶段构建 + Alpine + JRE 裁剪,把镜像瘦到 150MB。
一、镜像大小分析
- 1.1
docker images查看镜像大小 - 1.2
docker history <image>——每一层的大小 - 1.3 罪魁祸首——基础镜像大、构建依赖残留
二、优化 1:选择精简基础镜像
- 2.1
openjdk:8→ 600MB - 2.2
openjdk:8-jre-alpine→ 84MB - 2.3
eclipse-temurin:17-jre-alpine→ 180MB - 2.4 Alpine 的问题——musl libc 可能不兼容
三、优化 2:多阶段构建
- 3.1 第一阶段——Maven/Gradle 构建(包含 JDK)
- 3.2 第二阶段——只复制 JAR 包 + JRE
- 3.3
COPY --from=builder跨阶段复制 - 3.4 完整的 Dockerfile 示例
四、优化 3:JRE 裁剪
- 4.1
jlink创建自定义 JRE——只包含需要的模块 - 4.2
jdeps分析依赖——生成模块列表 - 4.3
jlink --add-modules java.base,java.sql,java.naming --output /opt/jre - 4.4 效果——JRE 从 200MB 剪到 50MB
五、优化 4:.dockerignore
- 5.1 排除不需要的文件——target/ 之外的所有
- 5.2 排除 .git、node_modules、logs
六、优化 5:层缓存优化
- 6.1 先 COPY 依赖——利用 Docker 构建缓存
- 6.2 频繁变化的文件放在最后
七、最终效果
- 优化前——1.2GB
- 优化后——150MB
- 拉取时间——30s → 3s
- 完整的 Dockerfile 对比
八、总结
- 多阶段构建是镜像瘦身的必杀技
- Alpine + jlink 是极致方案
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!