test-docker-persistence.sh 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/bin/sh
  2. set -eu
  3. ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
  4. IMAGE_NAME=${IMAGE_NAME:-emoon-okr:persistence-test}
  5. CONTAINER_NAME="okr-persistence-test-$$"
  6. DATA_DIR=$(mktemp -d "${TMPDIR:-/tmp}/okr-docker-data.XXXXXX")
  7. cleanup() {
  8. docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true
  9. rm -rf "$DATA_DIR"
  10. }
  11. trap cleanup EXIT INT TERM
  12. wait_for_startup() {
  13. attempts=0
  14. while [ "$attempts" -lt 90 ]; do
  15. if docker logs "$CONTAINER_NAME" 2>&1 | grep -q "Started OkrApplication"; then
  16. return 0
  17. fi
  18. if [ "$(docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null || true)" != "true" ]; then
  19. docker logs "$CONTAINER_NAME" >&2 || true
  20. return 1
  21. fi
  22. attempts=$((attempts + 1))
  23. sleep 1
  24. done
  25. docker logs "$CONTAINER_NAME" >&2 || true
  26. echo "容器启动超时" >&2
  27. return 1
  28. }
  29. start_container() {
  30. docker run -d \
  31. --name "$CONTAINER_NAME" \
  32. -e APP_SEED_DEMO_DATA=false \
  33. -v "$DATA_DIR:/app/data" \
  34. "$IMAGE_NAME" >/dev/null
  35. wait_for_startup
  36. }
  37. cd "$ROOT_DIR"
  38. docker build -t "$IMAGE_NAME" .
  39. start_container
  40. test -f "$DATA_DIR/okr-performance.db"
  41. docker rm -f "$CONTAINER_NAME" >/dev/null
  42. sqlite3 "$DATA_DIR/okr-performance.db" \
  43. "CREATE TABLE docker_persistence_probe (value TEXT NOT NULL); INSERT INTO docker_persistence_probe VALUES ('survived');"
  44. start_container
  45. docker rm -f "$CONTAINER_NAME" >/dev/null
  46. RESULT=$(sqlite3 "$DATA_DIR/okr-performance.db" "SELECT value FROM docker_persistence_probe LIMIT 1;")
  47. if [ "$RESULT" != "survived" ]; then
  48. echo "容器重建后 SQLite 哨兵数据丢失" >&2
  49. exit 1
  50. fi
  51. echo "Docker SQLite 首次初始化与容器重建持久性检查通过"