Spring Boot 内嵌 Tomcat 启动时,默认会使用 java.io.tmpdir(即 /tmp)来创建一个临时目录,用于存放工作文件(如 session、编译 JSP 等)。
但在当前运行环境中,/tmp 所在的磁盘或挂载点是 只读文件系统,Java 没有权限写入,因此创建失败。
问题分析
根本原因: Spring Boot内嵌Tomcat默认使用java.io.tmpdir系统属性指定的目录(通常是/tmp)来创建临时工作目录
环境限制: 在当前K8s运行环境中,/tmp目录所在的文件系统被挂载为只读模式
导致结果: Tomcat无法创建必要的临时文件和工作目录,应用启动失败
解决方案
1. 通过JVM参数修改临时目录
在K8s部署配置中设置JVM系统属性:
env:
- name: JAVA_OPTS
value: "-Djava.io.tmpdir=/tmp/writable"
2. 使用emptyDir卷挂载可写目录
spec:
containers:
- name: spring-boot-app
volumeMounts:
- name: tmp-volume
mountPath: /tmp/writable
volumes:
- name: tmp-volume
emptyDir: {}
3. 在应用配置中指定Tomcat基础目录
在application.properties中配置:
server.tomcat.basedir=/app/temp
4. 组合解决方案示例
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
env:
- name: JAVA_OPTS
value: "-Djava.io.tmpdir=/app/temp"
volumeMounts:
- name: temp-volume
mountPath: /app/temp
volumes:
- name: temp-volume
emptyDir: {}
欢迎来撩 : 汇总all
