发布于2026-07-28 阅读(0)
扫一扫,手机访问
最近折腾了一个Spring Boot后台管理系统的Docker部署,过程里遇到几个挺隐蔽的坑,尤其是Quartz定时任务框架的数据库表初始化那块。这里把整个流程走一遍,从JAR包打包到Dockerfile编写,再到容器启动和故障排查,希望能帮大家少走弯路。

打JAR包之前,最关键的一步是修改配置文件以适配生产环境。不少同学本地开发时习惯用localhost,直接打包丢到服务器上,容器里可就找不到localhost的数据库了。
打开application-prod.yml(或application.yml),重点检查以下几项:
/app/upload),别用Windows路径(C:/upload)。在项目根目录执行Ma ven命令:
mvn clean package
打包成功后,在target目录下找到myproject-admin.jar(本文以此命名)。
把JAR包上传到服务器(比如/opt/docker/myproject/),在同目录下创建Dockerfile文件。
# 1. 指定基础镜像
# 选用Eclipse Temurin (JDK 17) Alpine版,体积小,安全性好
FROM eclipse-temurin:17-jre-alpine
# 2. 设置工作目录
WORKDIR /app
# 3. 解决时区问题 (关键步骤)
# Alpine镜像默认时区UTC,需要安装tzdata并配置为上海时区
# 利用Docker缓存机制,将系统依赖安装放在COPY之前
RUN apk add --no-cache tzdata &&
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
echo "Asia/Shanghai" > /etc/timezone &&
apk del tzdata
# 4. 拷贝JAR包
COPY myproject-admin.jar .
# 5. 声明服务端口
EXPOSE 8080
# 6. 配置JVM参数
# -Xms/Xmx: 限制堆内存,防止容器OOM
# -Dja va.security.egd: 解决Linux下随机数生成阻塞导致启动慢的问题
ENV JA VA_OPTS="-Xms512m -Xmx1024m -Dja va.security.egd=file:/dev/./urandom"
# 7. 启动命令
# 使用sh -c启动让环境变量$JA VA_OPTS生效
ENTRYPOINT ["sh", "-c", "ja va $JA VA_OPTS -jar myproject-admin.jar"]
在JAR包所在目录执行:
docker build -t myproject-server:1.0 .
看到Successfully built和Successfully tagged的提示,说明构建成功。
docker run -d --name myproject-app -p 8080:8080 -m 1.5g --cpus 1 --restart=on-failure:5 -v /home/myproject/logs:/app/logs myproject-server:1.0
参数解释:
-d:后台运行。-m 1.5g:限制容器最大内存。JVM堆设了1G,给元空间等预留500M,防止容器被宿主机Kill。--restart=on-failure:5:容器异常退出时自动重启,增强健壮性。-v:挂载日志目录,方便在宿主机直接查看日志。容器启动瞬间报错,通过docker logs -f myproject-app查看日志,发现如下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysJobServiceImpl': ... Caused by: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Table 'db_name.QRTZ_LOCKS' doesn't exist
原因分析:项目集成了Quartz定时任务框架,并配置了JDBC模式持久化,但数据库中缺少Quartz所需的标准表结构(QRTZ_开头的表)。
找到项目中的sql/quartz.sql脚本并导入,结果执行时报错:
ERROR 1826 (HY000): Duplicate foreign key constraint name 'QRTZ_TRIGGERS_ibfk_1' ERROR 1824 (HY000): Failed to open the referenced table 'QRTZ_TRIGGERS'
原因在于脚本中的表之间存在外键依赖,且数据库中可能残留了之前的元数据,导致脚本执行中断。
核心思路:先关闭外键检查,再手动逐表创建(或使用不含外键的建表语句)。
在MySQL客户端执行以下SQL(已去除可能导致报错的外键约束,确保能跑通):
-- 1. 清理环境 SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; DROP TABLE IF EXISTS QRTZ_LOCKS; DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; DROP TABLE IF EXISTS QRTZ_TRIGGERS; DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; DROP TABLE IF EXISTS QRTZ_CALENDARS; -- 2. 建表语句(省略具体字段,请参考Quartz官方SQL) CREATE TABLE QRTZ_JOB_DETAILS (...) ENGINE=InnoDB; CREATE TABLE QRTZ_TRIGGERS (...) ENGINE=InnoDB; CREATE TABLE QRTZ_SIMPLE_TRIGGERS (...) ENGINE=InnoDB; -- ... 其他表 ... -- 3. 恢复检查 SET FOREIGN_KEY_CHECKS = 1;
执行成功后,重启容器:
docker restart myproject-app
服务顺利启动,日志显示Started Application。
部署完成后,记录几个高频使用的运维命令:
查看实时日志:
docker logs -f myproject-app
进入容器内部排查(Alpine镜像用sh):
docker exec -it myproject-app sh
复制容器内文件到宿主机:
docker cp myproject-app:/app/logs/sys-info.log /home/
Docker部署Ja va应用虽然简单,但细节决定成败:
SET FOREIGN_KEY_CHECKS = 0往往能通过。以上就是SpringBoot项目Docker部署全流程详解的详细内容。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8