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 | # 默认环境变量,可以在 docker run 或 K8s Deployment 里覆盖 |
参数抽离到环境变量
JAVA_OPTS→ JVM 参数SPRING_PROFILE→ Spring Boot 配置文件名SERVER_PORT→ 应用监听端口
1
docker run -e SERVER_PORT=9000 -e SPRING_PROFILE=test myapp:latest
VOLUME /java
确保gc.log和dump.hprof可以持久化到宿主机或挂载盘。ENTRYPOINT 使用
exec
确保容器内的java进程接管 PID 1,能正确响应SIGTERM,方便 K8s/Swarm 优雅下线。