image

Docker中基于Debian和Jdk-17编译Java Jre最小运行环境

  • WORDS 1539

在Docker中基于Debian和JDK 17编译Java JRE运行环境

JavaJdk-8之后便不再提供单独的 jre运行环境,这就造成在 Docker中部署 Java jar包项目时,只依赖一个 jdk便会使镜像大小大小超过 500MB

准备工作

建立使用Linux系统操作,需要安装 wgetor curldocker

# 下载jdk-17 没有使用openjdk
wget https://download.oracle.com/java/17/archive/jdk-17.0.7_linux-x64_bin.tar.gz
# 解压并进入
tar -zxvf ./jdk-17.0.7_linux-x64_bin.tar.gz -C ./jdk-17 --strip-components=1 && cd jdk-17

编译Jre

# 编译所有模块 关闭debug日志输出 开启压缩 输入到jre-17目录中
./bin/jlink --module-path jmods --add-modules ALL-MODULE-PATH  --compress=2 --strip-debug --output jre-17
# 将jre文件夹移到上级目录
mv jre-17 ../

编译debian-jre镜像

也可以使用其他 Linux镜像,DebianUbuntu的镜像都在 80MB左右。最小的 Alpine只有 5MB,但是就算 Alpine-gcc版本我编译后也用不了,提示缺少库文件。

vim Dockerfile
FROM debian:buster-slim

MAINTAINER example "example@email.com"

# 工作目录
WORKDIR /usr/local/java

# 添加jre到镜像中
COPY jre-17 /usr/local/java/jre-17

# 设置环境变量
ENV JAVA_HOME=/usr/local/java/jre-17

ENV CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV PATH=$PATH:$JAVA_HOME/bin
# 添加中文支持
ENV LANG C.UTF-8

CMD ["java", "-version"]
CMD ["timedatectl", "set-timezone", "Asia/Shanghai"]
# 编译镜像
docker build -t debian-jre:17 ./

镜像编译成功后直接在需要运行的项目中引入就行了,实测打包后的镜像不包含 jar包只有 150MB

后端项目中使用

FROM debian-jre:17

ADD *.jar app.jar

EXPOSE 7746

ENTRYPOINT ["java","-jar","-Xmx512m","-Xms512m","-XX:+UseZGC","-XX:MaxGCPauseMillis=200","app.jar","--spring.profiles.active=prod"]

几个 JVM参数

  • -Xmx:堆内存的最大值
  • -Xms:堆内存的最小值,推荐和最大值设置一样,避免 JVM动态设置内存
  • -xx:+UseZGC:使用 Jdk17中的 ZGC垃圾回收器
  • -XX:MaxGCPauseMillis=200:每次GC的最大间隔时间(毫秒)

关联文章

0 条评论