2026-07-15-docker-sqlite-persistence-design.md 1.3 KB

Docker 与 SQLite 持久化设计

目标

将 OKR 服务构建为单个 Docker 镜像,同时将 SQLite 数据库和备份永久保存在宿主机 ./data 目录。升级时只重新构建镜像并重建容器,不复制、覆盖或删除宿主机数据库。

运行结构

  • 镜像使用多阶段构建:Node 构建 Vue,Maven 将静态资源打入 Spring Boot JAR,JRE 运行 JAR。
  • Compose 将宿主机 ./data 绑定到容器 /app/data
  • 数据源固定为 jdbc:sqlite:/app/data/okr-performance.db,备份目录固定为 /app/data/backups
  • 启动脚本创建并验证 /app/data 可写。数据库文件不存在时不创建空文件,由现有 DatabaseInitializer 创建 schema、DatabaseMigrationRunner 执行迁移、DataInitializer 初始化基础数据。
  • 数据库存在时,启动逻辑直接复用原文件,只执行尚未执行的增量迁移。

升级边界

docker compose builddocker compose up -d --force-recreate 只替换镜像和容器。Compose 不声明匿名卷,不执行数据库复制,.dockerignore 排除 data/,因此数据库不会进入镜像层,也不会被镜像升级覆盖。

验证

自动检查 Docker 配置契约,并执行真实容器验收:首次启动生成数据库、写入哨兵数据、重建容器、确认同一数据库和哨兵数据仍存在。