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

开启容器只读文件系统后遇FileNotFoundException问题求助

问题分析与解决方案

你的securityContext基础配置方向是对的,但缺少了关键的可写目录挂载配置——Java应用运行时需要写入/tmp临时目录,同时如果你的应用需要修改证书库cacerts,对应的文件路径也需要可写,而只读根文件系统下这些路径默认是不可写的,这就是Pod崩溃的核心原因。

修正后的Helm配置示例

1. 核心配置:添加可写卷挂载

在你的Deployment模板(templates/deployment.yaml)或values.yaml中,为容器补充volumeMounts和volumes配置:

containers:
  - name: {{ .Chart.Name }}
    image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
    # 你的原有securityContext配置
    securityContext:
      readOnlyRootFilesystem: true
      allowPrivilegeEscalation: false
      runAsUser: 1000 # 根据实际需求调整非root用户ID
    # 添加需要挂载的可写路径
    volumeMounts:
      # 解决/tmp目录写入权限问题
      - name: tmp-volume
        mountPath: /tmp
      # 解决cacerts文件写入权限问题
      - name: cacerts-volume
        mountPath: /opt/java/openjdk/lib/security/cacerts
        subPath: cacerts
# 定义对应临时卷
volumes:
  - name: tmp-volume
    emptyDir: {} # 临时存储,Pod销毁时数据自动清除
  - name: cacerts-volume
    emptyDir: {}

2. 保留默认cacerts证书(可选)

如果你的应用需要使用JDK自带的默认证书库,可添加initContainers将默认证书复制到临时卷中:

initContainers:
  - name: copy-default-cacerts
    image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
    command: ["sh", "-c", "cp /opt/java/openjdk/lib/security/cacerts /mnt/cacerts && chmod 644 /mnt/cacerts"]
    volumeMounts:
      - name: cacerts-volume
        mountPath: /mnt
    securityContext:
      readOnlyRootFilesystem: true # init容器也可启用只读根文件系统

关键说明

  • emptyDir是Kubernetes提供的临时存储卷,挂载后对应路径会变为可写,满足Java应用的临时文件写入需求。
  • 对cacerts使用subPath挂载,避免覆盖整个/opt/java/openjdk/lib/security/目录,仅替换单个文件,保留目录下其他文件的只读状态。
  • runAsUser建议使用非root用户,配合readOnlyRootFilesystem进一步提升容器运行安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:16:04