You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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自动选择只读的默认路径,两种配置方式选一个就行:
    1. 启动命令里加JVM参数
      -Dorg.eclipse.jetty.webapp.basetempdir=/var/tmp/jetty
      
    2. 初始化WebAppContext时直接在代码里设置
      val webAppContext = new WebAppContext()
      webAppContext.setTempDirectory(new File("/var/tmp/jetty"))
      // 其余原有业务配置保持不变
      
  • 可选优化:减少临时目录写入
    如果你的服务没有使用JSP,直接移除JSP相关的配置类,可以减少大量不必要的临时文件写入:
    webAppContext.setConfigurations(
      webAppContext.getConfigurations.filterNot(_.isInstanceOf[org.eclipse.jetty.jsp.JettyJspServletContext])
    )
    

避坑提醒

别尝试改源码跳过临时目录校验,这个版本里除了启动阶段的校验,后续Servlet处理文件上传、JSP编译等逻辑都会直接依赖这个目录的写权限,强行跳过只会在运行阶段触发更难排查的异常。挂载独立临时卷的方案对业务代码侵入最小,稳定性最高,也完全满足只读根文件系统的安全要求。

内容的提问来源于stack exchange,提问作者Gumada Yaroslav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:48:34