test-docker-env-validation.sh 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #!/bin/sh
  2. set -eu
  3. ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
  4. cd "$ROOT_DIR"
  5. EMPTY_ENV=$(mktemp "${TMPDIR:-/tmp}/okr-empty-env.XXXXXX")
  6. ENTRYPOINT_DATA=$(mktemp -d "${TMPDIR:-/tmp}/okr-entrypoint-data.XXXXXX")
  7. trap 'rm -f "$EMPTY_ENV"; rm -rf "$ENTRYPOINT_DATA"' EXIT INT TERM
  8. assert_compose_requires() {
  9. missing_name=$1
  10. shift
  11. output_file="/tmp/okr-compose-missing-${missing_name}.out"
  12. if env -u "$missing_name" "$@" docker compose --env-file "$EMPTY_ENV" config >"$output_file" 2>&1; then
  13. echo "缺少 $missing_name 时,Compose 不应生成配置" >&2
  14. exit 1
  15. fi
  16. if ! grep -q "$missing_name" "$output_file"; then
  17. echo "Compose 缺失变量错误未指出 $missing_name" >&2
  18. exit 1
  19. fi
  20. }
  21. assert_compose_requires APP_JWT_SECRET \
  22. APP_SUPER_ADMIN_PASSWORD=verification-password APP_CORS_ORIGINS=https://okr.example.com
  23. assert_compose_requires APP_SUPER_ADMIN_PASSWORD \
  24. APP_JWT_SECRET=verification-secret-key-at-least-32-characters APP_CORS_ORIGINS=https://okr.example.com
  25. assert_compose_requires APP_CORS_ORIGINS \
  26. APP_JWT_SECRET=verification-secret-key-at-least-32-characters APP_SUPER_ADMIN_PASSWORD=verification-password
  27. if SPRING_PROFILES_ACTIVE=prod APP_JWT_SECRET=short \
  28. APP_DATA_DIR="$ENTRYPOINT_DATA" \
  29. APP_BACKUP_DIR= docker/entrypoint.sh true >/tmp/okr-entrypoint-weak-secret.out 2>&1; then
  30. echo "JWT 密钥不足 32 字符时,容器入口不应继续启动" >&2
  31. exit 1
  32. fi
  33. if ! grep -q "至少 32" /tmp/okr-entrypoint-weak-secret.out; then
  34. echo "容器入口未给出明确的 JWT 密钥长度提示" >&2
  35. exit 1
  36. fi
  37. SPRING_PROFILES_ACTIVE=prod \
  38. APP_JWT_SECRET=verification-secret-key-at-least-32-characters \
  39. APP_DATA_DIR="$ENTRYPOINT_DATA" \
  40. APP_BACKUP_DIR="$ENTRYPOINT_DATA/backups" \
  41. docker/entrypoint.sh true >/tmp/okr-entrypoint-valid-secret.out 2>&1
  42. echo "Docker 生产环境变量校验通过"