|
|
@@ -0,0 +1,61 @@
|
|
|
+#!/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 首次初始化与容器重建持久性检查通过"
|