Java应用Docker启动即退出主因是主进程非前台阻塞运行,需用ENTRYPOINT ["java", "-jar", "app.jar"]确保PID 1;同时须匹配JDK版本、配置时区LANG/TZ、避免Alpine兼容问题。
Java应用在Docker里启动就退出?检查
和
是否前台运行
容器不是虚拟机,主进程退出整个容器就停。Java应用如果用
后台启动,或者没加
导致尝试初始化GUI线程卡住,都会秒退。
必须确保
命令是前台阻塞式执行,推荐写成
,别用shell形式(如
),后者会绕过PID 1直接起子进程,信号转发异常
Spring Boot默认已前台运行,但老项目用
或
的要删掉
加
或
能快速判断是启动失败还是静默退出
Docker镜像里Java版本不一致?优先用
而非
本地IDE用JDK 17,Dockerfile却写
,结果拉到的是JDK 21——类文件版本不匹配报
,这种错不会明说“Java版本不对”,只抛
。
查自己编译用的版本:
→ 对应
:Java 17=61,Java 21=65
镜像名严格匹配:编译用17就选
,别信
小体积诱惑,musl libc可能引发JNI或DNS解析问题
Spring Boot 3.x起强制要求JDK 17+,但
镜像不含
,线上诊断需额外装
容器内时区/编码乱码?别改宿主机,统一在Dockerfile里设
Java读
或
输出时间,本地是CST,容器里变成UTC;中文日志变问号——根本不是Spring配置问题,是基础环境缺失。
加两行:
和
,顺序不能反,LANG得在TZ前生效
Alpine镜像要额外
Spring Boot 2.7+可通过
和
补救,但治标不治本,容器层该配还得配
开发时反复build镜像太慢?用
挂载class/jar跳过COPY
改一行代码就要
再
,中间
把整个jar重传一遍,浪费时间还掩盖真实启动流程问题。
Docker Sandbox
创建并管理 Docker 沙箱虚拟机环境以安全执行代理。适用于运行不受信任代码、探索包或隔离代理工作负载。支持 Claude、Codex、Copilot、Gemini 和 Kiro 代理,并提供网络代理控制。
下载
立即学习
“
Java免费学习笔记(深入)
”;
开发阶段Dockerfile里删掉
,改用
注意权限:Mac/Windows上挂载的jar可能被标记为不可执行,加
或提前
这招只适用于单jar包场景;多模块Maven项目建议用
热加载,容器里只跑一个固定基础镜像
跨平台一致性真正的难点不在Dockerfile语法,而在Java进程对OS信号、时区、字符集这些隐式依赖的显式声明——漏掉任意一项,CI跑通、本地崩掉、测试环境时间错位,都是同一类问题的不同表象。
ENTRYPOINTCMDjava -jar app.jar &-Djava.awt.headless=truejavaENTRYPOINT ["java", "-jar", "app.jar"]ENTRYPOINT java -jar app.jarnohup&-XX:+PrintGCDetails-Dlogging.level.root=INFOopenjdk:jre-xx-slimlatestFROM openjdk:latestUnsupportedClassVersionErrorjava.lang.UnsupportedClassVersionError: ... major.minor version 61javac -versionmajor.minoropenjdk:17-jre-slimalpineslimjstackjmapopenjdk-17-jdk-headlessENVnew Date()SimpleDateFormatENV TZ=Asia/ShanghaiENV LANG=C.UTF-8RUN apk add --no-cache tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimespring.jackson.date-formatspring.jackson.time-zonevolumedocker builddocker runCOPY target/*.jarCOPYdocker run -v $(pwd)/target/app.jar:/app.jar openjdk:17-jre-slim java -jar /app.jar--user 1001:1001chmod +xspring-boot-devtools