test-docker-config.sh 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #!/bin/sh
  2. set -eu
  3. ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
  4. cd "$ROOT_DIR"
  5. assert_file() {
  6. if [ ! -f "$1" ]; then
  7. echo "缺少文件: $1" >&2
  8. exit 1
  9. fi
  10. }
  11. assert_contains() {
  12. file=$1
  13. expected=$2
  14. if ! grep -Fq -- "$expected" "$file"; then
  15. echo "$file 缺少配置: $expected" >&2
  16. exit 1
  17. fi
  18. }
  19. assert_file Dockerfile
  20. assert_file compose.yaml
  21. assert_file docker/entrypoint.sh
  22. assert_file .dockerignore
  23. assert_contains Dockerfile "FROM node:20"
  24. assert_contains Dockerfile "FROM maven:3.9"
  25. assert_contains Dockerfile "COPY --from=frontend-build /build/frontend/dist"
  26. assert_contains Dockerfile 'ENTRYPOINT ["/app/entrypoint.sh"]'
  27. assert_contains compose.yaml "./data:/app/data"
  28. assert_contains compose.yaml 'image: emoon-okr:${APP_IMAGE_TAG:-latest}'
  29. assert_contains compose.yaml "SPRING_DATASOURCE_URL: jdbc:sqlite:/app/data/okr-performance.db"
  30. assert_contains compose.yaml "APP_BACKUP_DIR: /app/data/backups"
  31. assert_contains compose.yaml 'APP_JWT_SECRET: ${APP_JWT_SECRET:?'
  32. assert_contains compose.yaml 'APP_SUPER_ADMIN_PASSWORD: ${APP_SUPER_ADMIN_PASSWORD:?'
  33. assert_contains compose.yaml 'APP_CORS_ORIGINS: ${APP_CORS_ORIGINS:?'
  34. assert_contains docker/entrypoint.sh 'mkdir -p "$DATA_DIR" "$BACKUP_DIR"'
  35. assert_contains docker/entrypoint.sh '数据库目录不可写'
  36. assert_contains docker/entrypoint.sh 'APP_JWT_SECRET 长度必须至少 32 字符'
  37. assert_contains .dockerignore "data/"
  38. assert_contains .dockerignore "**/target/"
  39. assert_contains .dockerignore "**/node_modules/"
  40. echo "Docker 配置契约检查通过"