为什么 Java 11 base Docker 图像这么大? (openjdk:11-jre-slim)
Why is the Java 11 base Docker image so large? (openjdk:11-jre-slim)
Java 11 被宣布为最新的 LTS 版本。因此,我们正在尝试基于此 Java 版本启动新服务。
但是,Java 11 的基础 Docker 图像比 Java 8 的等效图像大得多:
openjdk:8-jre-alpine
: 84MB
openjdk:11-jre-slim
: 283MB
(我只考虑每个 Java 版本的 official OpenJDK 和 最轻量级的 图像.)
深入挖掘发现以下内容"things":
openjdk:11-jre-slim
图像使用基本图像 debian:sid-slim
。这带来了 2 个问题:
这比 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/
再深入一点,我发现了这个沉重的"root"——就是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 的 slim/headless/JRE 包与类似的 OpenJDK 8 包相比这么大?
- 这个 modules 文件是什么,它在 OpenJDK 11 中带来了 135 MB?
UPD:作为这些挑战的解决方案,可以使用以下答案:
Why is alpine
not used any more as a base image for Java 11 slim images?
这是因为,遗憾的是,目前没有针对 Alpine 的官方稳定 OpenJDK 11 构建。
Alpine 使用 musl libc,而不是大多数 Linux 使用的标准 glibc,这意味着 JVM 必须与 musl libc 兼容才能支持 vanilla Alpine。 musl OpenJDK 端口正在 OpenJDK 的 Portola 项目下开发。
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.
Alpine 目前唯一稳定的 OpenJDK 版本是 7 和 8,由 IcedTea 项目提供。
但是 - 如果您愿意考虑官方 OpenJDK 以外的其他软件,Azul's ZuluOpenJDK 提供了一个引人注目的替代方案:
- 它支持 Java 11 on Alpine musl(撰写本文时版本 11.0.2);
- 它是经过认证的 OpenJDK 构建,使用 OpenJDK TCK 合规性套件进行了验证;
- 它是免费的、开源的并且 docker 就绪 (Dockerhub)。
有关支持可用性和路线图,请参阅 Azul support roadmap。
更新,2019 年 3 月 6 日: 从昨天开始,openjdk11
在 Alpine 存储库中可用!可以使用以下方式在 Alpine 上获取它:
apk --no-cache add openjdk11
该软件包基于 jdk11u
OpenJDK 分支加上来自项目 Portola 的移植修复,引入了以下 PR。感谢 Alpine 团队。
Why is the unstable sid version used for LTS Java images?
这是一个公平的问题/请求。在稳定的 Debian 版本上实际上有一个提供 Java 11 的公开票:
https://github.com/docker-library/openjdk/issues/237
更新,26/12/18: 问题已经解决,现在OpenJDK 11 slim镜像是基于最近制作的stretch-backports
OpenJDK 11可用 (PR link).
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 介绍了模块系统,与jar 文件相比,这是一种新的改进的包和资源分组方法。 Oracle 的这篇文章对这个特性做了很详细的介绍:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
modules
文件捆绑了 JRE 附带的所有模块。可以使用 java --list-modules
打印完整的模块列表。 modules
确实是一个非常大的文件,正如评论中所说,它包含所有标准模块,因此非常臃肿。
但是要注意的一件事是它取代了 rt.jar
和 tools.jar
,后者已被弃用,除其他外,因此在考虑 modules
的大小时,与 pre- 9 OpenJDK 构建,应减去 rt.jar
和 tools.jar
的大小(它们总共应占用约 80MB)。
至于 07.2019 https://adoptopenjdk.net/ 对 Java 11:
有官方 Alpine 支持
但是,模块(jmods,jlink
)在组装最小应用程序时仍应考虑。
注意:slim 图像不包含某些模块(如java.sql
)-它们被明确排除(https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233)
https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim
在docker openjdk 存储库中,slim jre 11 图像小于 70mb
如果您只考虑官方镜像,并且您的目标是使用可用的较小 JRE 镜像,我建议您查看 官方 OpenJDK 镜像 openjdk:11-jre-slim-buster
只有 69.2 MB。
Java 11 被宣布为最新的 LTS 版本。因此,我们正在尝试基于此 Java 版本启动新服务。
但是,Java 11 的基础 Docker 图像比 Java 8 的等效图像大得多:
openjdk:8-jre-alpine
: 84MBopenjdk:11-jre-slim
: 283MB
(我只考虑每个 Java 版本的 official OpenJDK 和 最轻量级的 图像.)
深入挖掘发现以下内容"things":
openjdk:11-jre-slim
图像使用基本图像debian:sid-slim
。这带来了 2 个问题:这比
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/
再深入一点,我发现了这个沉重的"root"——就是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 的 slim/headless/JRE 包与类似的 OpenJDK 8 包相比这么大?
- 这个 modules 文件是什么,它在 OpenJDK 11 中带来了 135 MB?
UPD:作为这些挑战的解决方案,可以使用以下答案:
Why is
alpine
not used any more as a base image for Java 11 slim images?
这是因为,遗憾的是,目前没有针对 Alpine 的官方稳定 OpenJDK 11 构建。
Alpine 使用 musl libc,而不是大多数 Linux 使用的标准 glibc,这意味着 JVM 必须与 musl libc 兼容才能支持 vanilla Alpine。 musl OpenJDK 端口正在 OpenJDK 的 Portola 项目下开发。
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.
Alpine 目前唯一稳定的 OpenJDK 版本是 7 和 8,由 IcedTea 项目提供。
但是 - 如果您愿意考虑官方 OpenJDK 以外的其他软件,Azul's ZuluOpenJDK 提供了一个引人注目的替代方案:
- 它支持 Java 11 on Alpine musl(撰写本文时版本 11.0.2);
- 它是经过认证的 OpenJDK 构建,使用 OpenJDK TCK 合规性套件进行了验证;
- 它是免费的、开源的并且 docker 就绪 (Dockerhub)。
有关支持可用性和路线图,请参阅 Azul support roadmap。
更新,2019 年 3 月 6 日: 从昨天开始,openjdk11
在 Alpine 存储库中可用!可以使用以下方式在 Alpine 上获取它:
apk --no-cache add openjdk11
该软件包基于 jdk11u
OpenJDK 分支加上来自项目 Portola 的移植修复,引入了以下 PR。感谢 Alpine 团队。
Why is the unstable sid version used for LTS Java images?
这是一个公平的问题/请求。在稳定的 Debian 版本上实际上有一个提供 Java 11 的公开票:
https://github.com/docker-library/openjdk/issues/237
更新,26/12/18: 问题已经解决,现在OpenJDK 11 slim镜像是基于最近制作的stretch-backports
OpenJDK 11可用 (PR link).
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 介绍了模块系统,与jar 文件相比,这是一种新的改进的包和资源分组方法。 Oracle 的这篇文章对这个特性做了很详细的介绍:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
modules
文件捆绑了 JRE 附带的所有模块。可以使用 java --list-modules
打印完整的模块列表。 modules
确实是一个非常大的文件,正如评论中所说,它包含所有标准模块,因此非常臃肿。
但是要注意的一件事是它取代了 rt.jar
和 tools.jar
,后者已被弃用,除其他外,因此在考虑 modules
的大小时,与 pre- 9 OpenJDK 构建,应减去 rt.jar
和 tools.jar
的大小(它们总共应占用约 80MB)。
至于 07.2019 https://adoptopenjdk.net/ 对 Java 11:
有官方 Alpine 支持但是,模块(jmods,jlink
)在组装最小应用程序时仍应考虑。
注意:slim 图像不包含某些模块(如java.sql
)-它们被明确排除(https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233)
https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim
在docker openjdk 存储库中,slim jre 11 图像小于 70mb
如果您只考虑官方镜像,并且您的目标是使用可用的较小 JRE 镜像,我建议您查看 官方 OpenJDK 镜像 openjdk:11-jre-slim-buster
只有 69.2 MB。