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

rad*_*tao 107 java docker alpine-linux java-11

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

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

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

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

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

    • 这比60 MB大 alpine:3.8

    • Debian的sid版本是不稳定

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

所以,现在问题来了:

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

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

  • 为什么OpenJDK 11的纤薄/无头/ JRE封装与类似的OpenJDK 8封装相比如此之大?

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

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

val*_*ano 135

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

那是因为,遗憾的是,目前没有正式的OpenJDK 11版本用于Alpine.

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

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

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

目前,Alpine唯一稳定的OpenJDK版本是7和8.

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

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

缺点是,LTS支持仅适用于企业版,而不是社区版本的保护(参见路线图).

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

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

更新,26/12/18:问题已经解决,现在OpenJDK 11苗条图像基于openjdk11最近提供的OpenJDK 11(PR链接).

为什么OpenJDK 11的纤薄/无头/ JRE封装与类似的OpenJDK 8封装相比如此之大?什么是在OpenJDK 11中带来135 MB的模块文件?

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

jdk11u文件捆绑了JRE附带的所有模块.可以打印完整的模块列表stretch-backports.modules确实是一个非常大的文件,并且如评论所述,它包含所有标准模块,因此它非常臃肿.

然而有一点需要注意的是,它取代了java --list-modules,modules并且在其他方​​面被弃用了,因此在考虑rt.jar与9之前的OpenJDK版本相比时的大小时tools.jar,modules应该减去和的大小(它们应该占用80MB左右) .


rad*_*tao 12

至于 07.2019 https://adoptopenjdk.net/对 Java 11 有官方的 Alpine 支持:

但是,在组装最小应用程序时仍应考虑模块(jmodsjlink)。

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


dav*_*e79 8

如果您只考虑官方镜像,并且您的目标是使用可用的较小 JRE 镜像,我建议您查看只有 69.2 MB的官方 OpenJDK镜像openjdk:11-jre-slim-buster