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

时间:2018-11-19 13:24:35

标签: java docker alpine java-11

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

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

(每个Java版本仅考虑official OpenJDK 最轻巧的 图片。)

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

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

    • 这比alpine:3.8

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

  • 映像中安装的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超薄图像的基础图像?

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

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

    • 这个 modules 文件是什么,在OpenJDK 11中带来了135 MB的存储空间?

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

4 个答案:

答案 0 :(得分:91)

  

为什么alpine不再用作Java 11超薄图像的基本图像?

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

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

当前状态总结在OpenJDK 11 page上:

  •   

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

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

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

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

不利的一面是,LTS支持仅适用于企业客户,而不能保证获得社区版本(有关更多详细信息,请参见Azul support roadmap)。

  

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

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

更新,2018年12月26日:,此问题已解决,现在OpenJDK 11超薄映像基于stretch-backports OpenJDK 11(最近可用)({{3 }}。

  

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

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

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

但是要注意的一件事是,它取代了已弃用的rt.jartools.jar,因此,与9之前的OpenJDK相比,考虑modules的大小时构建时,应减去rt.jartools.jar的大小(它们总共要占用80MB)。

答案 1 :(得分:4)

如果您仅考虑使用官方图像,而您的目标目标是使用较小的JRE图像,建议您查看官方OpenJDK 图像openjdk:11-jre-slim-buster,该图像仅为69.2 MB。

答案 2 :(得分:0)

2019年7月https://adoptopenjdk.net/的官方Alpine支持Java 11:

但是,当一个汇编最小的应用程序时,仍应考虑模块( jmods jlink)。

注意 slim 图像不包含某些模块(例如java.sql)-它们被明确排除(https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233

答案 3 :(得分:0)

https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim

在docker openjdk存储库中,苗条的jre 11映像小于70mb