2026-07-15-docker-sqlite-persistence.md 2.4 KB

Docker 与 SQLite 持久化实现计划

面向 AI 代理的工作者: 必需子技能:使用 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(- [ ])语法来跟踪进度。

目标: 构建可升级的 Docker 服务,并保证 SQLite 始终由宿主机 ./data 持久保存。

架构: 多阶段 Dockerfile 生成包含前端静态资源的 Spring Boot JAR;Compose 通过 bind mount 将 ./data 映射到 /app/data。启动脚本只准备目录,由应用现有初始化器区分首次建库和增量升级。

技术栈: Docker、Docker Compose、Node 20、Maven 3.9、Eclipse Temurin 17、Spring Boot、SQLite。

镜像名称: emoon-okr


任务 1:建立 Docker 配置契约

文件:

  • 创建:scripts/test-docker-config.sh

  • [ ] 编写断言:Dockerfile 多阶段构建、Compose 使用 ./data:/app/data、数据源及备份目录指向 /app/data.dockerignore 排除运行数据。

  • [ ] 运行 bash scripts/test-docker-config.sh,确认因文件缺失而失败。

  • [ ] 保留该脚本作为后续 Docker 配置回归测试。

任务 2:实现镜像与启动边界

文件:

  • 创建:Dockerfile
  • 创建:docker/entrypoint.sh
  • 创建:.dockerignore

  • [ ] 使用 Node 阶段执行 npm ci && npm run build

  • [ ] 使用 Maven 阶段复制前端产物并执行 mvn package -DskipTests

  • [ ] 使用 JRE 阶段安装 gosu,启动时创建并检查 /app/data,再以非 root 用户运行 JAR。

  • [ ] 运行配置契约测试,确认通过。

任务 3:提供 Compose 部署配置

文件:

  • 创建:compose.yaml
  • 创建:.env.example
  • 创建:docs/docker-deployment.md

  • [ ] 将宿主机 ./data 绑定到 /app/data,显式配置 SQLite URL 和备份目录。

  • [ ] 提供 JWT、管理员密码和 CORS 必填环境变量示例。

  • [ ] 记录首次部署、升级、备份和恢复命令,明确禁止删除 ./data

  • [ ] 运行 docker compose config 验证配置可解析。

任务 4:真实验证初始化和升级持久性

文件:

  • 创建:scripts/test-docker-persistence.sh

  • [ ] 在临时宿主机目录启动容器,确认自动生成 SQLite 文件。

  • [ ] 向数据库写入哨兵数据,重建同一镜像的容器。

  • [ ] 确认数据库文件和哨兵数据仍存在,随后清理测试容器和临时目录。

  • [ ] 运行前后端全量测试与 git diff --check