当前位置: 首页 > 面试题库 >

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

欧阳睿范
2023-03-14
问题内容

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

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

  • openjdk:8-jre-alpine:84 MB

  • openjdk:11-jre-slim283 MB

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

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

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

    • 比60 MB大 alpine:3.8

    • 在Debian的sid版本是不稳定

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

    • 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/

更深入地讲,我发现了这种繁重的“根”-它modules是JDK 的文件:

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

因此,现在出现的问题是:

  • 为什么alpine不再将其用作Java 11超薄映像的基础映像?

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

  • 为什么与类似的OpenJDK 8软件包相比,OpenJDK 11的slim / headless / JRE软件包这么大?

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

问题答案:

为什么alpine不再将其用作Java 11超薄映像的基础映像?

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

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

当前状态汇总在OpenJDK 11页面上:

此页面上先前可用的Alpine Linux构建已从JDK 11
GA中删除。它尚未投入生产,因为它尚未经过充分的测试,无法被视为GA版本。请使用可抢先使用的JDK 12 Alpine Linux构建代替它。

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

但是,如果您愿意考虑使用官方OpenJDK之外的其他东西,则Azul的Zulu
OpenJDK提供了一种引人注目的替代方案:

  • 它支持Alpine musl上的Java 11(撰写本文时为11.0.2版);
  • 它是经过认证的OpenJDK构建,已使用OpenJDK TCK合规套件进行了验证;
  • 它是免费的,开放源代码的,并且可用于docker(Dockerhub)。

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

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

apk --no-cache add openjdk11

该软件包基于jdk11uOpenJDK分支以及项目Portola的移植修补程序,并随以下PR引入。非常感谢Alpine团队。

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

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

更新,18年12月26日: 问题已解决,现在OpenJDK 11超薄映像基于stretch-backports最近可用的OpenJDK
11(PR链接)。

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

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

modules文件捆绑了JRE随附的所有模块。完整的模块列表可以用来打印java --list- modulesmodules确实是一个非常大的文件,并且正如所注释的那样,它包含所有标准模块,因此非常膨胀。

但是要注意的一件事是,它被替换rt.jar并且tools.jar已弃用,因此,与modulesOpenJDK
9之前的版本进行比较时,考虑到的大小,应减去rt.jar和的大小tools.jar(它们应占用80MB的总和) 。



 类似资料:
  • Java11被宣布为最新的LTS版本。因此,我们正在尝试基于这个Java版本启动新的服务。 但是,Java11的基本Docker映像要比Java8的等效映像大得多: > :84 MB :283 MB (我只考虑官方的OpenJDK和每个Java版本的最轻量级映像。) 更深一层的挖掘,揭开了以下“事情”: 安装在映像中的包比(在运行的Docker容器内)大3倍: > : : 深入研究之后,我发现了这

  • 问题内容: 宣布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大小的微型编辑器),图像的大小已增加到530 MB。我在此基础上添加了Git(30-ish MB),然后将图像大小的火箭提高到830 MB。 那不是疯了吗? 我试图导出和导入容器以删除历史记录/中间图像。这项工作最多可节省25 MB,现在我的图像大小为804 MB。我也尝试过

  • 问题内容: 对于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的图像?

  • 问题内容: 根据Docker文档,要构建自己的映像,您必须始终使用指令指定基本映像。 显然,Docker索引中有很多图像可供选择,但是如果我想构建自己的图像怎么办?那可能吗? 如果我理解正确,该映像是在Ubuntu上构建的,并且我想尝试使用Debian映像。另外,我想真正了解Docker的工作原理,该映像对我来说仍然是一个黑匣子。 编辑: 有关创建基本映像的官方文档 问题答案: 您可以看一下如何创