当前位置: 首页 > 知识库问答 >
问题:

为什么Java11基础Docker图像这么大?(OpenJDK:11-jre-slim)

庄萧迟
2023-03-14

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

但是,Java11的基本Docker映像要比Java8的等效映像大得多:

>

  • OpenJDK:8-jre-alpine:84 MB

    openjdk:11-jre-slim:283 MB

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

    更深一层的挖掘,揭开了以下“事情”:

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

    >

  • 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苗条图像的基础图像?

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

    UPD:作为这些挑战的解决方案,可以使用以下答案:Java11应用程序作为docker映像

  • 共有1个答案

    令狐阳秋
    2023-03-14

    为什么alpine不再用作Java11苗条图像的基础图像?

    这是因为,不幸的是,目前还没有一个官方的稳定的OpenJDK11版本用于Alpine。

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

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

    从JDK 11 GA起,本页上以前可用的Alpine Linux构建已被删除。它还没有准备好生产,因为它还没有经过充分的测试,不能被认为是GA构建。请使用早期访问的JDK12Alpine Linux版本。

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

    但是--如果您愿意考虑官方OpenJDK以外的其他版本,Azul的Zulu OpenJDK提供了一个令人信服的替代方案:

    • 它支持Alpine musl上的Java 11(编写本报告时版本为11.0.2);
    • 它是一个经过认证的OpenJDK构建,使用OpenJDK TCK compliance套件进行了验证;
    • 它是免费的、开放源码的和docker就绪的(Dockerhub)。

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

    apk --no-cache add openjdk11
    

    为什么不稳定的sid版本用于LTS Java映像?

    那是个公平的问题/要求。在稳定的Debian发行版上提供Java11实际上有一个开放的票证:
    https://github.com/docker-library/openjdk/issues/237

    更新,26/12/18:问题已经解决,现在OpenJDK 11的slim映像是基于最近可用的stregt-backportsOpenJDK 11的(PR链接)。

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

    与jar文件相比,Java9引入了模块系统,这是一种新的和改进的包和资源分组方法。Oracle的这篇文章非常详细地介绍了这一特性:
    https://www.Oracle.com/corporate/features/derlanding-java-9-modules.html

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

    但是,需要注意的一点是,它替换了rt.jartools.jar这两个已被弃用的版本,因此,当与9版之前的OpenJDK构建相比较时,在计算module的大小时,应该减去rt.jartools.jar的大小(它们加起来应该占80MB左右)。

     类似资料:
    • 问题内容: 宣布Java 11是最新的LTS版本。因此,我们正在尝试基于此Java版本启动新服务。 但是,Java 11的基本Docker映像比Java 8的等效映像大得多: :84 MB : 283 MB (我只考虑 官方的OpenJDK 和每个Java版本的 最轻量的 映像。) 更深入的挖掘发现了以下“事物”: 该图像使用基本图像。这带来了两个问题: 比60 MB大 在Debian的版本是不稳

    • 问题内容: 宣布Java 11是最新的LTS版本。因此,我们正在尝试基于此Java版本启动新服务。 但是,Java 11的基本Docker映像比Java 8的等效映像大得多: (我只考虑官方的OpenJDK和每个Java版本的最轻量的映像。) 更深入的挖掘发现了以下“事物”: 该openjdk:11-jre-slim图像使用基本图像debian:sid-slim。这带来了两个问题: 比60 MB大

    • 我从Fedora通过Dockerfile制作了一个简单的图像(最初为320 MB)。 添加了Nano(这个1MB大小的微小编辑器),图像的大小上升到了530MB。我在上面添加了Git(大约30 MB),然后我的图像大小的sky-rockets达到了830 MB。 这不是疯了吗? 我已经尝试导出和导入容器来删除历史/中间图像。这一努力节省了25 MB,现在我的图像大小是804 MB。我也尝试在一个上

    • 我有一个非常简单的dockerfile 然后使用 根据我对Docker的了解,当我键入时,它应该只在下显示;但是这不是发生的事情。相反,我看到: 为什么会出现基础图像?例如,我从中提取的存储库 但这并没有出现。那么在这种情况下,为什么会有基础图像呢?

    • 问题内容: 对于Linux发行版,有一个openjdk-8-jre软件包,仅用于安装openjdk 8的jre部分。最新的Windows openjdk 11是否熟悉?可以从http://jdk.java.net/11/下载最新的openjdk版本,但是我找不到仅下载jre部分的方法。 问题答案: 我们不随JDK 11提供单独的JRE下载。相反,您可以使用jlink创建仅包含应用程序所需模块集的自

    • 我正在将一个rust应用程序打包到docker映像以部署到我的服务器。我发现rust docker的图像大小超过1GB(比使用java和python的任何其他应用程序都大)。为什么rust docker的形象如此巨大?我检查了该层,发现cargo build命令需要400MB以上的内存。 是否可以缩小rust docker的图像?