为什么openjdk中只包含了jre_为什么Java 11基础Docker镜像如此之大? (的openjdk:11-JRE-苗条)...

Java 11 is announced to be the most recent LTS version. So, we're trying to start new services based on this Java version.

However, the base Docker image for Java 11 is much larger than the equivalent for Java 8:

(I'm considering only the official OpenJDK and the most lightweight images for each Java version.)

Deeper digging uncovered the following "things":

the openjdk:11-jre-slim image uses the base image debian:sid-slim. This brings 2 issues:

this is 60 MB larger than alpine:3.8

the Debian sid versions are unstable

the openjdk-11-jre-headless package installed in the image is 3 times larger than openjdk8-jre (inside running Docker container):

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/

Going deeper I discovered the "root" of this heaviness - it's the modules file of the JRE:

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

-rw-r--r-- 1 root 135M Oct 17 07:31 /usr/lib/jvm/java-11-openjdk-amd64/lib/modules

So, now the questions which came:

Why is alpine not used any more as a base image for Java 11 slim images?

Why is the unstable sid version used for LTS Java images?

Why is the slim/headless/JRE package for OpenJDK 11 so large compared to the similar OpenJDK 8 package?

What is this modules file which brings 135 MB in OpenJDK 11?

Please don't discuss and propose:

custom images from other (anonymous) developers etc.

other (unstable/non-LTS) Java versions - we want to move forward with official LTS versions (e.g. don't propose OpenJDK 12 images based on alpine, because Java 12 won't be LTS).

解决方案Why is alpine not used any more as a base image for Java 11 slim images?

That's because, sadly, currently there is no official stable OpenJDK 11 build for Alpine.

Alpine uses musl libc, as opposed to the standard glibc used by most Linuxes out there, which means that a JVM must be compatible with musl libc for supporting vanilla Alpine. The musl OpenJDK port is being developed under OpenJDK's Portola project.

The current status is summarized on the OpenJDK 11 page:

The Alpine Linux build previously available on this page was removed as of JDK 11 GA. It’s not production-ready because it hasn’t been tested thoroughly enough to be considered a GA build. Please use the early-access JDK 12 Alpine Linux build in its place.

The only stable OpenJDK versions for Alpine currently, to my knowledge, are 7 and 8.

Why is the unstable sid version used for LTS Java images?

That's a fair question / request. There's actually an open ticket for providing Java 11 on a stable Debian release:

https://github.com/docker-library/openjdk/issues/237

Why is the slim/headless/JRE package for OpenJDK 11 so large compared to the similar OpenJDK 8 package? What is this modules file which brings 135 MB in OpenJDK 11?

Java 9 introduced the module system, which is a new and improved approach for grouping packages and resources, compared to jar files. This article from Oracle gives a very detailed introduction to this feature:

https://www.oracle.com/corporate/features/understanding-java-9-modules.html

The modules file bundles all modules shipped with the JRE. The complete list of modules could be printed with java --list-modules. modules is indeed a very large file, and as commented, it contains all standard modules, and it is therefore quite bloated.

One thing to note however is that it replaces rt.jar and tools.jar which became deprecated, among other things, so when accounting for the size of modules when comparing to pre-9 OpenJDK builds, the sizes of rt.jar and tools.jar should be subtracted (they should take up some 80MB combined).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值