为什么Java 11基础Docker镜像如此之大? (的openjdk:11-JRE-苗条)

问题描述 投票:79回答:1

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

但是,Java 11的基本Docker镜像远大于Java 8的等效镜像:

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

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

  • 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图像的基本图像?
  • 为什么不稳定的sid版本用于LTS Java图像?
  • 为什么OpenJDK 11的纤薄/无头/ JRE封装与类似的OpenJDK 8封装相比如此之大? 什么是在OpenJDK 11中带来135 MB的模块文件?

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

java docker alpine java-11
1个回答
114
投票

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

那是因为,遗憾的是,目前还没有针对Alpine的官方稳定的OpenJDK 11版本。

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

目前的状况总结在OpenJDK 11 page上:

  • 自JDK 11 GA起,此页面上以前提供的Alpine Linux版本已被删除。它不是生产就绪的,因为它没有经过足够的测试,不能被认为是GA版本。请使用早期访问的JDK 12 Alpine Linux版本。

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

但是 - 如果你愿意考虑官方OpenJDK之外的其他问题,那么Azul's Zulu OpenJDK提供了一个引人注目的选择:

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

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

更新,2009年3月6日:截至昨天,openjdk11可用于Alpine资源库!可以使用以下方法抓住Alpine:

apk --no-cache add openjdk11

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

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

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

更新,26/12/18:问题已经解决,现在OpenJDK 11苗条图像基于最近推出的stretch-backports OpenJDK 11(PR link)。

为什么OpenJDK 11的纤薄/无头/ 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)。


2
投票

至于07.2019,https://adoptopenjdk.net/对Java 11有正式的Alpine支持:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.