基于SpringBoot+Docker实现可挂载可热更新的config.json

 更新时间:2026年02月03日 09:30:02   作者:Knight_AL  
在实际项目中,我们经常需要让前端读取一个 config.json,并且希望它 支持在 Docker 容器里挂载覆盖、实时生效,避免每次修改都要重新打包,所以本文给大家介绍了如何基于SpringBoot+Docker实现可挂载可热更新的config.json,需要的朋友可以参考下

一、背景:为什么 jar 内的 config.json 不能被覆盖?

很多人遇到这样的场景:

  • 前端请求 GET /config.json
  • 想通过 Docker 挂载一份外部 config.json 到容器里覆盖 jar 里的那份
  • 结果发现改了也不生效 → 还是读到打包进 jar 的老版本

根本原因:

Spring Boot 不会自动替换 jar 内部的静态资源文件,挂载的静态资源只是在查找路径里排在前面而已。

换句话说:

文件如果在 jar 里,通过 classpath 加载的优先级并不因为挂载而被覆盖(实际查找路径可能不同)。

二、Spring Boot 静态资源加载机制

在 Spring Boot 里,静态资源是这样被查找的:

# Spring Boot 2.4+ 使用这个
spring.web.resources.static-locations=file:/app/static/, classpath:/static/

# Spring Boot 2.3- 使用这个
spring.resources.static-locations=file:/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 里写如下逻辑:

@RestController
public class WvpIndexController {

    private static final String EXTERNAL_PATH = "/app/config/config.json";
    private static final String CLASSPATH_PATH = "classpath:/static/config.json";

    @GetMapping({"/config.json", "/wvp/config.json"})
    public ResponseEntity<Resource> getConfig(HttpServletResponse response) {

        Resource resource;

        // 1) 优先尝试读取外部挂载文件
        File external = new File(EXTERNAL_PATH);
        if (external.exists() && external.isFile()) {
            resource = new FileSystemResource(external);
        } else {
            // 2) 不存在则 fallback 到内置 classpath
            resource = new ClassPathResource("static/config.json");
        }

        // 设置不缓存
        response.setHeader("Cache-Control", "no-store");

        return ResponseEntity.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-locations=file:/app/static/,classpath:/static/", \
  "-Dspring.resources.static-locations=file:/app/static/,classpath:/static/", \
  "-jar", "wvp.jar"]

六、总结

方案是否可挂载覆盖是否热更新是否兼容多个路径
只依赖 Spring Boot 静态资源
加上后端优先逻辑

推荐方案:后端优先读取外部挂载文件 + fallback classpath + no-cache

这样你只要:

docker-compose up -d

然后在宿主机改 config.json,前端刷新立即生效。

以上就是基于SpringBoot+Docker实现可挂载可热更新的config.json的详细内容,更多关于SpringBoot Docker可挂载可热更新config.json的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis千万级数据查询的解决方式,避免OOM问题

    Mybatis千万级数据查询的解决方式,避免OOM问题

    这篇文章主要介绍了Mybatis千万级数据查询的解决方式,避免OOM问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java中基于maven实现zxing二维码功能

    Java中基于maven实现zxing二维码功能

    这篇文章主要介绍了Java中基于maven实现zxing二维码功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • JAVA面试题 start()和run()详解

    JAVA面试题 start()和run()详解

    这篇文章主要介绍了JAVA面试题 启动线程是start()还是run()?为什么?,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Java实现快速幂算法详解

    Java实现快速幂算法详解

    快速幂是用来解决求幂运算的高效方式。此算法偶尔会出现在笔试以及面试中,特意花时间研究了下这题,感兴趣的小伙伴快跟随小编一起学习一下
    2022-10-10
  • Java音频处理之音频流转音频文件和获取音频播放时长详解

    Java音频处理之音频流转音频文件和获取音频播放时长详解

    这篇文章主要为大家详细介绍了如何使用Java实现音频流转音频文件和获取音频播放时长功能,文中的示例代码简洁易懂,有需要的小伙伴可以了解下
    2025-07-07
  • ObjectInputStream 和 ObjectOutputStream 介绍_动力节点Java学院整理

    ObjectInputStream 和 ObjectOutputStream 介绍_动力节点Java学院整理

    ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。本文给大家详细介绍了ObjectInputStream 和 ObjectOutputStream的相关知识,感兴趣的朋友一起学习吧
    2017-05-05
  • java类访问权限与成员访问权限解析

    java类访问权限与成员访问权限解析

    这篇文章主要针对java类访问权限与成员访问权限进行解析,对类与成员访问权限进行验证,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • springboot+maven快速构建项目的示例代码

    springboot+maven快速构建项目的示例代码

    本篇文章主要介绍了springboot+maven快速构建项目的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • MybatisPlus中@TableLogic注解的使用实现

    MybatisPlus中@TableLogic注解的使用实现

    @TableLogic注解是MyBatis-Plus框架中用于处理逻辑删除的注解,逻辑删除是一种常见的删除策略,其中并不真正删除数据记录,而是通过修改某个标记字段的值来表示记录已经被删除,方便以后恢复或者审计,感兴趣的可以了解一下
    2025-10-10
  • ssm实现分页查询的实例

    ssm实现分页查询的实例

    下面小编就为大家带来一篇ssm实现分页查询的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论