You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于Docker的Spring Boot本地开发热部署配置咨询

开发环境Docker+Spring Boot热部署方案(基于Tomcat镜像)

嗨,针对你的需求,我整理了一套不用重复打包构建镜像就能实现代码变更热更的方案,核心是结合Spring Boot DevTools和Docker卷挂载,直接同步编译后的代码到容器里:

核心思路

Spring Boot DevTools的自动重启依赖于编译后的类文件/资源文件变更,所以我们不需要挂载整个war包或者target目录,而是把本地编译好的target/classes目录挂载到容器内Tomcat部署的应用对应的WEB-INF/classes目录,这样代码修改后IDE自动编译,变更会实时同步到容器,DevTools就会触发应用重启。

具体步骤

1. 准备工作:开启IDE自动编译

首先确保你的IDE会自动编译代码变更:

  • IntelliJ IDEA:打开Settings > Build, Execution, Deployment > Compiler,勾选Build project automatically;然后按Ctrl+Shift+Alt+/打开Registry,勾选compiler.automake.allow.when.app.running
  • Eclipse:默认开启自动编译,若未开启可在Project > Build Automatically勾选

2. 配置Spring Boot DevTools

src/main/resources/application.properties(或yml)里添加以下配置,确保自动重启和资源热更生效:

# 开启DevTools自动重启
spring.devtools.restart.enabled=true
# 监听代码和资源文件目录(默认已包含,可按需扩展)
spring.devtools.restart.additional-paths=src/main/java,src/main/resources
# 关闭资源缓存,确保静态文件修改立即生效
spring.web.resources.cache.period=0
# 若使用模板引擎(如Thymeleaf),关闭模板缓存
spring.thymeleaf.cache=false

3. Docker卷挂载配置

方式一:使用docker run命令

第一次运行前,先执行mvn package生成war包(让Tomcat自动解压到webapps/api目录),之后用以下命令启动容器,挂载本地编译目录:

docker run -d \
  -p 8080:8080 \
  # 挂载本地编译后的classes目录到容器内应用的classes目录
  -v $(pwd)/target/classes:/usr/local/tomcat/webapps/api/WEB-INF/classes \
  # 可选:挂载静态资源目录,实现静态文件热更
  -v $(pwd)/src/main/resources/static:/usr/local/tomcat/webapps/api/static \
  tomcat:9.0-jre8-alpine

方式二:使用docker-compose(更推荐)

创建docker-compose.yml文件,管理容器配置:

version: '3.8'
services:
  tomcat-dev:
    image: tomcat:9.0-jre8-alpine
    ports:
      - "8080:8080"
    volumes:
      # 核心挂载:本地编译类文件同步到容器应用
      - ./target/classes:/usr/local/tomcat/webapps/api/WEB-INF/classes
      # 可选:静态资源热更
      - ./src/main/resources/static:/usr/local/tomcat/webapps/api/static
      # 可选:配置文件热更(若不想等IDE编译,直接改src下的配置)
      - ./src/main/resources/application.properties:/usr/local/tomcat/webapps/api/WEB-INF/classes/application.properties

启动命令:docker-compose up -d

4. 验证热部署

修改本地代码(比如Controller里的返回值),IDE自动编译后,等待1-2秒DevTools会触发应用重启,刷新浏览器就能看到变更,完全不需要重新打包或构建镜像!

关键注意事项

  • 第一次启动容器前,必须先执行mvn package生成war包,让Tomcat自动解压出webapps/api目录,否则挂载的classes目录会找不到对应路径
  • 不要挂载整个target目录到Tomcat的webapps,这会导致war包和解压后的目录冲突,干扰Tomcat部署
  • 如果你的应用有依赖的外部Jar包,不需要挂载,因为第一次打包war时已经包含了所有依赖,容器里的Tomcat会从war解压后的WEB-INF/lib加载依赖

内容的提问来源于stack exchange,提问作者Vetouz

火山引擎 最新活动