OpenShift上ColdFusion修改Tomcat server.xml后.car配置无法加载问题
问题根源
- ConfigMap通过subPath挂载的单个文件默认是只读属性,而ColdFusion启动过程中需要动态修改
server.xml(包括删除临时的ColdFusionDockerStartupScripts上下文配置、写入运行时参数),写入失败就会触发只读文件系统报错。 - 你用于制作ConfigMap的
server.xml是ColdFusion启动修改后的版本,缺少启动阶段必须的/ColdFusionDockerStartupScripts路径映射配置,导致启动脚本无法找到importCAR.cfm执行管理员配置导入。
解决方案
推荐选择以下两种方案之一实现需求:
方案1:动态修改默认server.xml(优先推荐)
无需提前准备完整的server.xml存入ConfigMap,通过启动命令在ColdFusion进程启动前给默认配置添加允许符号链接的属性,完全保留原有启动逻辑。
- 删除原有Deployment中挂载server.xml的volume和volumeMount配置
- 修改Deployment的启动命令,增加sed修改逻辑,示例如下:
command: ["/bin/sh", "-c"] args: - sed -i '/<Resources.*base="\/app".*/ s/\/>$/ allowLinking="true"\/>/' /opt/coldfusion/cfusion/runtime/conf/server.xml && /opt/coldfusion/start-cf.sh
注意将
/opt/coldfusion/start-cf.sh替换为你镜像中实际的ColdFusion启动脚本路径。
方案2:Init容器挂载自定义server.xml
如果需要自定义更多server.xml配置,可使用Init容器避免只读问题:
- 从官方ColdFusion镜像中提取未被启动流程修改的原始server.xml(可以启动一个临时容器,在CF进程启动前拷贝出默认配置文件),在该文件的/app对应Resources标签中添加
allowLinking="true"属性,再将修改后的文件存入ConfigMap。 - 修改Deployment配置,新增Init容器、调整挂载逻辑:
# Init容器配置 initContainers: - name: init-config image: busybox:latest volumeMounts: - name: tomcat-config-q mountPath: /tmp/server.xml subPath: server.xml - name: cf-conf mountPath: /opt/coldfusion/cfusion/runtime/conf/ command: ["/bin/sh", "-c"] args: - cp /tmp/server.xml /opt/coldfusion/cfusion/runtime/conf/server.xml && chmod 664 /opt/coldfusion/cfusion/runtime/conf/server.xml # 原volumeMounts配置删除server.xml的subPath挂载,增加conf目录挂载 volumeMounts: - mountPath: /opt/coldfusion/cfusion/runtime/conf/ name: cf-conf # volumes配置增加临时存储 volumes: - configMap: defaultMode: 420 name: tomcat-config-q name: tomcat-config-q - emptyDir: {} name: cf-conf
验证点
配置完成后重启Pod,可看到:
- 启动阶段不再报只读文件系统错误
importCAR.cfm可正常执行,管理员配置正常加载- 应用路径下的符号链接可正常访问
内容的提问来源于stack exchange,提问作者giarc4
相关产品推荐
相关产品推荐

