开启容器只读文件系统后遇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
相关产品推荐
相关产品推荐

