为什么 Java 11 基础 Docker 镜像如此之大? (openjdk:11-jre-slim)

新手上路,请多包涵

Java 11 被宣布为最新的 LTS 版本。因此,我们正在尝试基于此 Java 版本启动新服务。

但是,Java 11 的基本 Docker 映像比 Java 8 的等价物大得多:

(我只考虑 官方的 OpenJDK 和每个 Java 版本 的最轻量级的 图像。)

更深入的挖掘发现了以下“事情”:

  • openjdk:11-jre-slim 图像使用基础图像 debian:sid-slim 。这带来了两个问题:

    • 这比 alpine:3.8 大 60 MB

    • Debian sid 版本不稳定

  • 安装在镜像中的 openjdk-11-jre-headless 包比 openjdk8-jre 大 3 倍(在运行的 Docker 容器内):

    • openjdk:8-jre-alpine :
     / # du -hs /usr/lib/jvm/java-1.8-openjdk/jre/lib/
    57.5M   /usr/lib/jvm/java-1.8-openjdk/jre/lib/
    
    
    • openjdk:11-jre-slim :
     # du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/
    179M    /usr/lib/jvm/java-11-openjdk-amd64/lib/
    
    

    再深入一点,我发现了这种沉重的“根源”——它是 JDK 的 modules 文件:

     # ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
    135M    /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
    
    

所以,现在问题来了:

  • 为什么 alpine 不再用作 Java 11 slim 映像的基础映像?

  • 为什么 LTS Java 镜像使用不稳定的 sid 版本?

  • 为什么 OpenJDK 11 的 slim/headless/JRE 包与类似的 OpenJDK 8 包相比如此之大?

    • 这个在 OpenJDK 11 中带来 135 MB 的 模块 文件是什么?

UPD :作为这些挑战的解决方案,可以使用以下答案: Java 11 application as docker image

原文由 radistao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.9k
2 个回答

为什么 alpine 不再用作 Java 11 slim 映像的基础映像?

这是因为,遗憾的是,目前还没有针对 Alpine 的官方稳定 OpenJDK 11 构建。

Alpine 使用 musl libc,而不是大多数 Linux 使用的标准 glibc,这意味着 JVM 必须与 musl libc 兼容才能支持 vanilla Alpine。 musl OpenJDK 端口正在 OpenJDK 的 Portola 项目下开发。

OpenJDK 11 页面 上总结了当前状态:

自 JDK 11 GA 起,此页面上之前提供的 Alpine Linux 版本已被删除。它还没有准备好生产,因为它没有经过足够彻底的测试,无法被视为 GA 构建。请使用早期访问的 JDK 12 Alpine Linux 版本代替它。

Alpine 目前唯一稳定的 OpenJDK 版本是 7 和 8,由 IcedTea 项目提供。

但是 - 如果您愿意考虑官方 OpenJDK 以外的其他选择, Azul 的 Zulu OpenJDK 提供了一个引人注目的替代方案:

  • 它支持 Alpine musl 上的 Java 11 (截至撰写本文时版本为 11.0.2);
  • 它是经过认证的 OpenJDK 构建,使用 OpenJDK TCK 合规套件进行了验证;
  • 它是免费的、开源的和 docker 就绪 ( Dockerhub )。

有关支持可用性和路线图,请参阅 Azul 支持路线图

2019 年 3 月 6 日更新: 截至昨天, openjdk11 在 Alpine 存储库中可用!可以使用以下方法在 Alpine 上抓取它:

 apk --no-cache add openjdk11

该软件包基于 jdk11u OpenJDK 分支以及来自 Portola 项目的移植修复,并通过以下 PR 引入。非常感谢 Alpine 团队。

为什么 LTS Java 镜像使用不稳定的 sid 版本?

这是一个公平的问题/要求。实际上有一张在稳定的 Debian 版本上提供 Java 11 的公开票:

https://github.com/docker-library/openjdk/issues/237

更新,26/12/18: 问题已解决,现在 OpenJDK 11 slim 映像基于最近发布的 stretch-backports OpenJDK 11( 公关链接)。

为什么 OpenJDK 11 的 slim/headless/JRE 包与类似的 OpenJDK 8 包相比如此之大?这个在 OpenJDK 11 中带来 135 MB 的 模块 文件是什么?

Java 9 引入了模块系统,与 jar 文件相比,这是一种新的改进方法,用于对包和资源进行分组。 Oracle 的这篇文章非常详细地介绍了这个特性:

https://www.oracle.com/corporate/features/understanding-java-9-modules.html

modules 文件捆绑了 JRE 附带的所有模块。可以使用 java --list-modules 打印完整的模块列表。 modules 确实是一个非常大的文件,正如评论所言,它包含所有标准模块,因此非常臃肿。

但是要注意的一件事是,它取代了 rt.jartools.jar 已被弃用,除其他外,当考虑到 modules 的大小时--- -9 OpenJDK 构建,应该减去 rt.jartools.jar 的大小(它们应该占用大约 80MB 的总和)。

原文由 valiano 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您只考虑官方镜像,而您的目标是使用可用的较小 JRE 镜像,我建议您查看 官方 OpenJDK 镜像 openjdk:11-jre-slim-buster 只有 69.2 MB。

原文由 Davide Martorana 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题