dockerfile构建java程序定义jvm/应用参数

基础结构

1
ENTRYPOINT ["java", "<JVM参数>", "-jar", "/java/crab.jar", "<应用参数>"]
  • java:启动 JVM
  • <JVM参数>:控制内存、日志、诊断等 JVM 行为
  • -jar /java/crab.jar:启动你的 Spring Boot 应用
  • <应用参数>:传递给应用的参数,如端口或 profile

-Dspring.profiles.active=pro jvm参数可以转换应用参数 –spring.profiles.active=pro


JVM 参数拆解

参数 说明
-XX:+UseContainerSupport 让 JVM 感知容器的内存限制(Docker 环境下很重要)
-XX:InitialRAMPercentage=25.0 JVM 初始堆大小占容器可用内存的 25%
-XX:MaxRAMPercentage=50.0 JVM 最大堆大小占容器可用内存的 50%
-XX:+UnlockDiagnosticVMOptions 解锁一些诊断选项,比如 NativeMemoryTracking
-XX:NativeMemoryTracking=summary 启用本地内存跟踪,summary 模式
-XX:+HeapDumpOnOutOfMemoryError 当 OOM 时生成堆转储
-XX:HeapDumpPath=/java/dump.hprof 堆转储文件路径
-Xlog:gc*:file=/java/gc.log:time,uptime,level,tags GC 日志输出到文件,并带时间戳
-Dspring.profiles.active=pro 激活 Spring Boot 的 pro 配置文件
--server.port=7812 Spring Boot 应用监听的端口

生产Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 默认环境变量,可以在 docker run 或 K8s Deployment 里覆盖
ENV JAVA_OPTS="-XX:+UseContainerSupport \
-XX:InitialRAMPercentage=25.0 \
-XX:MaxRAMPercentage=50.0 \
-XX:+UnlockDiagnosticVMOptions \
-XX:NativeMemoryTracking=summary \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/java/dump.hprof \
-Xlog:gc*:file=/java/gc.log:time,uptime,level,tags"
ENV SPRING_PROFILE=pro
ENV SERVER_PORT=7812

# 创建挂载点,避免日志和 dump 丢失
VOLUME /java

# ENTRYPOINT 使用 shell 形式拼接参数
ENTRYPOINT exec java $JAVA_OPTS \
-Dspring.profiles.active=${SPRING_PROFILE} \
-jar /java/crab.jar \
--server.port=${SERVER_PORT}
  1. 参数抽离到环境变量

    • JAVA_OPTS → JVM 参数
    • SPRING_PROFILE → Spring Boot 配置文件名
    • SERVER_PORT → 应用监听端口
    1
    docker run -e SERVER_PORT=9000 -e SPRING_PROFILE=test myapp:latest
  2. VOLUME /java
    确保 gc.logdump.hprof 可以持久化到宿主机或挂载盘。

  3. ENTRYPOINT 使用 exec
    确保容器内的 java 进程接管 PID 1,能正确响应 SIGTERM,方便 K8s/Swarm 优雅下线。