# 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`。