核心内容摘要
LiteLLM故障排查全景指南:从诊断到预防的系统化解决方案
文章目录
背景为什么 jar 内的 config.json 不能被覆盖
Spring Boot 静态资源加载机制
解决方案结构
核心实现优先读外部文件
完整 Dockerfile 示例
八、
总结前言在实际项目中我们经常需要让前端读取一个config.json并且希望它支持在 Docker 容器里挂载覆盖、实时生效避免每次修改都要重新打包。
背景为什么 jar 内的 config.json 不能被覆盖很多人遇到这样的场景前端请求GET /config.json想通过 Docker 挂载一份外部config.json到容器里覆盖 jar 里的那份结果发现改了也不生效 → 还是读到打包进 jar 的老版本 根本原因Spring Boot 不会自动替换 jar 内部的静态资源文件挂载的静态资源只是在查找路径里排在前面而已。
换句话说文件如果在 jar 里通过 classpath 加载的优先级并不因为挂载而被覆盖实际查找路径可能不同。
Spring Boot 静态资源加载机制在 Spring Boot 里静态资源是这样被查找的# Spring Boot
4 使用这个 spring.web.resources.static-locationsfile:/app/static/, classpath:/static/ # Spring Boot
3- 使用这个 spring.resources.static-locationsfile:/app/static/, classpath:/static/这个配置表示优先级资源位置第一外部目录 file:/app/static/第二jar 内 classpath:/static/注意这是查找顺序不是覆盖机制。
解决方案结构为了做到✔ Docker 容器挂载的 config.json 可覆盖✔ 修改后立即生效无重启无缓存✔ 支持/config.json和/wvp/config.json两种访问路径我们的整体方案是前端请求 /config.json 或 /wvp/config.json → 后端 Controller 先尝试读取 容器内 /app/config/config.json → 如果存在直接返回 → 如果不存在再 fallback 到 classpath:/static/config.json同时设置返回头Cache-Control: no-store避免浏览器缓存旧配置。
核心实现优先读外部文件在你的 Controller 里写如下逻辑RestControllerpublicclassWvpIndexController{privatestaticfinalStringEXTERNAL_PATH/app/config/config.json;privatestaticfinalStringCLASSPATH_PATHclasspath:/static/config.json;GetMapping({/config.json,/wvp/config.json})publicResponseEntityResourcegetConfig(HttpServletResponseresponse){Resourceresource;//
优先尝试读取外部挂载文件FileexternalnewFile(EXTERNAL_PATH);if(external.exists()external.isFile()){resourcenewFileSystemResource(external);}else{//
不存在则 fallback 到内置 classpathresourcenewClassPathResource(static/config.json);}// 设置不缓存response.setHeader(Cache-Control,no-store);returnResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(resource);}}
完整 Dockerfile 示例FROM openjdk:17-jdk-alpine WORKDIR /app COPY wvp.jar /app/wvp.jar COPY static /app/static # 静态资源 fallback EXPOSE 8080 ENTRYPOINT [java, \ -Dspring.web.resources.static-locationsfile:/app/static/,classpath:/static/, \ -Dspring.resources.static-locationsfile:/app/static/,classpath:/static/, \ -jar, wvp.jar]
八、