在Docker中基于Debian和JDK 17编译Java JRE运行环境
Java在 Jdk-8之后便不再提供单独的 jre运行环境,这就造成在 Docker中部署 Java jar包项目时,只依赖一个 jdk便会使镜像大小大小超过 500MB。
准备工作
建立使用Linux系统操作,需要安装 wgetor curl和 docker
# 下载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镜像,Debian和 Ubuntu的镜像都在 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 条评论