如何配置Jetty不创建任何文件适配OpenShift只读文件系统容器
Jetty 9.2 只读容器部署问题解决方案
首先明确:9.2.19.v20160908版本的Jetty无法做到运行全程完全不创建任何文件。这个版本的Web应用启动逻辑强制要求存在可写的临时工作目录,用来处理JSP编译、war包内嵌资源解压、multipart格式上传临时缓存、运行时字节码生成等操作,你看到的Parent for temp dir not configured correctly: writeable=false就是启动阶段校验临时目录写权限时直接抛出的。
针对OpenShift要求的只读根文件系统场景,不需要放开整个容器的写权限,只需要给Jetty单独分配一个可写的临时存储路径即可,完全符合安全规范,具体操作如下:
具体配置方案
- 第一步:给Pod挂载临时可写卷
OpenShift原生支持emptyDir类型的临时存储卷,这类卷的生命周期和Pod完全绑定,Pod销毁后数据自动清除,不会写入持久化存储,也不会修改容器原有只读根文件系统的内容,把卷挂载到容器内的/var/tmp/jetty路径即可。 - 第二步:显式指定Jetty临时目录路径
避免Jetty自动选择只读的默认路径,两种配置方式选一个就行:- 启动命令里加JVM参数
-Dorg.eclipse.jetty.webapp.basetempdir=/var/tmp/jetty - 初始化WebAppContext时直接在代码里设置
val webAppContext = new WebAppContext() webAppContext.setTempDirectory(new File("/var/tmp/jetty")) // 其余原有业务配置保持不变
- 启动命令里加JVM参数
- 可选优化:减少临时目录写入
如果你的服务没有使用JSP,直接移除JSP相关的配置类,可以减少大量不必要的临时文件写入:webAppContext.setConfigurations( webAppContext.getConfigurations.filterNot(_.isInstanceOf[org.eclipse.jetty.jsp.JettyJspServletContext]) )
避坑提醒
别尝试改源码跳过临时目录校验,这个版本里除了启动阶段的校验,后续Servlet处理文件上传、JSP编译等逻辑都会直接依赖这个目录的写权限,强行跳过只会在运行阶段触发更难排查的异常。挂载独立临时卷的方案对业务代码侵入最小,稳定性最高,也完全满足只读根文件系统的安全要求。
内容的提问来源于stack exchange,提问作者Gumada Yaroslav
相关产品推荐
相关产品推荐

