# 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 build` 与 `docker compose up -d --force-recreate` 只替换镜像和容器。Compose 不声明匿名卷,不执行数据库复制,`.dockerignore` 排除 `data/`,因此数据库不会进入镜像层,也不会被镜像升级覆盖。 ## 验证 自动检查 Docker 配置契约,并执行真实容器验收:首次启动生成数据库、写入哨兵数据、重建容器、确认同一数据库和哨兵数据仍存在。