#!/bin/sh set -eu ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) IMAGE_NAME=${IMAGE_NAME:-emoon-okr:persistence-test} CONTAINER_NAME="okr-persistence-test-$$" DATA_DIR=$(mktemp -d "${TMPDIR:-/tmp}/okr-docker-data.XXXXXX") cleanup() { docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true rm -rf "$DATA_DIR" } trap cleanup EXIT INT TERM wait_for_startup() { attempts=0 while [ "$attempts" -lt 90 ]; do if docker logs "$CONTAINER_NAME" 2>&1 | grep -q "Started OkrApplication"; then return 0 fi if [ "$(docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null || true)" != "true" ]; then docker logs "$CONTAINER_NAME" >&2 || true return 1 fi attempts=$((attempts + 1)) sleep 1 done docker logs "$CONTAINER_NAME" >&2 || true echo "容器启动超时" >&2 return 1 } start_container() { docker run -d \ --name "$CONTAINER_NAME" \ -e APP_SEED_DEMO_DATA=false \ -v "$DATA_DIR:/app/data" \ "$IMAGE_NAME" >/dev/null wait_for_startup } cd "$ROOT_DIR" docker build -t "$IMAGE_NAME" . start_container test -f "$DATA_DIR/okr-performance.db" docker rm -f "$CONTAINER_NAME" >/dev/null sqlite3 "$DATA_DIR/okr-performance.db" \ "CREATE TABLE docker_persistence_probe (value TEXT NOT NULL); INSERT INTO docker_persistence_probe VALUES ('survived');" start_container docker rm -f "$CONTAINER_NAME" >/dev/null RESULT=$(sqlite3 "$DATA_DIR/okr-performance.db" "SELECT value FROM docker_persistence_probe LIMIT 1;") if [ "$RESULT" != "survived" ]; then echo "容器重建后 SQLite 哨兵数据丢失" >&2 exit 1 fi echo "Docker SQLite 首次初始化与容器重建持久性检查通过"