基于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




