CronJob设readOnlyRootFilesystem后遇只读文件系统及文件找不到问题
问题分析与解决方案
问题根源
你设置readOnlyRootFilesystem: true后,将emptyDir挂载到了程序所在的/opt/ibm/common-pool-cronjob/目录——这个操作会直接覆盖镜像中原先存放在该目录下的所有文件(包括你要运行的text.py),因为emptyDir初始状态是空的,所以程序会报找不到文件的错误。
解决方法
方法一:挂载emptyDir到程序实际需要写入的子目录
找到Python程序真正需要写入的具体子路径(比如日志目录、临时文件目录,例如/opt/ibm/common-pool-cronjob/tmp),仅将emptyDir挂载到这个子目录,既满足读写需求,又不会覆盖原程序文件。
修改后的配置片段:
volumeMounts: # 只挂载到需要写入的子目录 - mountPath: /opt/ibm/common-pool-cronjob/tmp name: tmp-volume volumes: - emptyDir: {} name: tmp-volume
方法二:调整程序写入路径到默认可写目录
多数容器环境中/tmp目录默认允许写入(即使根文件系统只读),你可以修改Python程序的配置,让它把需要写入的内容放到/tmp下,无需额外挂载卷到程序目录。
方法三:用init容器复制原目录文件到emptyDir(适合必须挂载整个目录的场景)
如果确实需要让整个/opt/ibm/common-pool-cronjob/具备读写权限,可以通过init容器先将镜像里的程序文件复制到emptyDir,再让主容器使用这个卷:
containers: - env: - name: ENV_VAR value: value - name: MAINTAIN_HA_POOL value: "true" - name: PROCESS_SCHEDULER_REQUESTS value: "true" - name: MAINTAIN_NODE_POOL value: "false" - name: ENABLE_LSV3 value: "false" image: us.icr.io/nz-cloud/nzsaas-common-pool-cronjob:master-2.1.2.0-20240329-111245 imagePullPolicy: Always name: common-machine-pool-cronjob-container resources: {} securityContext: privileged: true readOnlyRootFilesystem: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /opt/ibm/common-pool-cronjob/ name: tmp-volume # 添加init容器负责复制文件 initContainers: - name: copy-app-files image: us.icr.io/nz-cloud/nzsaas-common-pool-cronjob:master-2.1.2.0-20240329-111245 command: ["sh", "-c", "cp -r /opt/ibm/common-pool-cronjob/. /tmp/app/"] volumeMounts: - mountPath: /tmp/app name: tmp-volume volumes: - emptyDir: {} name: tmp-volume
内容的提问来源于stack exchange,提问作者Frozen Shot
相关产品推荐
相关产品推荐

