gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:34:13 25 4
gpt4 key购买 nike

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

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

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

深入挖掘发现了以下“东西”:

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

    • 这比 alpine:3.8

    • 大 60 MB
    • Debian sid版本不稳定

  • 图片中安装的openjdk-11-jre-headless包比openjdk8-jre3倍(里面运行 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 的 modules 文件是什么?

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

最佳答案

Why is alpine not used any more as a base image for Java 11 slim images?

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

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

当前状态总结在 OpenJDK 11 page :

The Alpine Linux build previously available on this page was removed as of JDK 11 GA. It’s not production-ready because it hasn’t been tested thoroughly enough to be considered a GA build. Please use the early-access JDK 12 Alpine Linux build in its place.

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

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

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

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

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

apk --no-cache add openjdk11

该软件包基于 jdk11u OpenJDK 分支加上 Portola 项目的移植修复,引入以下 PR .非常感谢 Alpine 团队。

Why is the unstable sid version used for LTS Java images?

这是一个公平的问题/要求。实际上有一张在稳定的 Debian 版本上提供 Java 11 的公开票:
https://github.com/docker-library/openjdk/issues/237

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

Why is the slim/headless/JRE package for OpenJDK 11 so large compared to the similar OpenJDK 8 package? What is this modules file which brings 135 MB in OpenJDK 11?

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.jar 的大小和 tools.jar应该减去(它们应该占用大约 80MB 的总和)。

关于java - 为什么 Java 11 基础 Docker 镜像如此之大? (openjdk :11-jre-slim),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53375613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com