背景
如果您使用基于JVM的语言(Java、Kotlin、Scala等)已有一段时间,你可能已经注意到,从Java 11开始,Java运行时环境(JRE)不再有单独的发行版。由于这一决定,许多Java开发工具包(JDK)Docker镜像分发商(例如:OpenJDK、Amazon Correto等)不提供JRE作为单独的Docker镜像,使用这些镜像整体Docker镜像大小约为360MB,而实际应用程序Jar包大小约为26MB。在我看来,整个Docker镜像的大小太大了,应用减小它,以便为每个将使用该Docker镜像的人节省空间和网络带宽。现在,让我们看看如何大幅减小Docker镜像的大小。
这个问题的根源
Java平台模块系统(JPMS)是随Java 9引入的。我们可以使用 JPMS 创建适合特定应用程序的自己的自定义 JRE。例如,如果应用程序不使用音频、图像或JavaBeans相关功能,我们可以 java.desktop完全删除该模块以释放 Docker 映像中的空间。
如前所述,从Java 11开始,不再有单独的JRE发行版。这意味着即使我们只想运行一个简单的基于JVM的应用程序,我们也必须安装整个JDK。这是由于Java 9中引入的模块化。主要理念是,每个人都应用能够创建自己的JRE,而不是提供满足每个人需求的通用JRE。许多JDK镜像提供商都遵循相同的理念,省略JRE发行版。
不幸的是,使用此类镜像会显着增加Docker镜像的大小。
为了更好地理解这个问题,让我们看一下运行一个简单的基于JVM的应用程序所需的基本Dockerfile。
# greetings.Dockerfile
FROM amazoncorretto:17-alpine
EXPOSE 8080
COPY ./greetings/build/libs/greetings.jar /app/
WORKDIR /app
CMD ["java", "-jar", "greetings.jar"]
我们在这里使用它amazoncorretto:17-alpine作为基础镜像,并将应用程序Jar包复制到其中。最后我们运行Jar包
让我们运行这个 Dockerfile 看看它有多大。
ls -lh greetings/build/lib