From 628d886cba6afe3d50b93268063af7d79ddd42c4 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Fri, 24 Apr 2026 09:45:10 +0900 Subject: [PATCH] fix(policy): mount domain_policy.yaml into fastapi + multi-path loader MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 배포 검증 중 발견: domain_policy.yaml 이 repo root 에 있지만 fastapi 컨테이너의 build context 는 ./app 이라 COPY 가 포함하지 못함. 결과 load_policy() 가 FileNotFoundError. 1. docker-compose.yml: config.yaml 과 동일 패턴으로 읽기전용 bind mount - ./domain_policy.yaml:/app/domain_policy.yaml:ro 2. app/policy/loader.py: _resolve_path 에 4 개 후보 검색 추가 — cwd / /app / /app/.. / .parent.parent.parent 순으로 파일 존재 확인. 첫 매칭 반환. 로컬/컨테이너/다른 배포 환경 모두 호환. CI: pytest tests/policy/ -q → 98 passed. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/policy/loader.py | 21 ++++++++++++++++++--- docker-compose.yml | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/policy/loader.py b/app/policy/loader.py index 36f7f70..794fca6 100644 --- a/app/policy/loader.py +++ b/app/policy/loader.py @@ -11,7 +11,7 @@ import yaml from policy.schema import DomainPolicy -DEFAULT_POLICY_PATH = "domain_policy.yaml" +DEFAULT_POLICY_FILENAME = "domain_policy.yaml" POLICY_PATH_ENV = "POLICY_PATH" @@ -21,8 +21,23 @@ def _resolve_path(path: str | None) -> Path: env_path = os.environ.get(POLICY_PATH_ENV) if env_path: return Path(env_path) - # repo root 기준 상대 경로 — working dir 에 따라 결정 - return Path(DEFAULT_POLICY_PATH) + + # 검색 순서 (multi-env 호환): + # 1. cwd / domain_policy.yaml 로컬 pytest (repo-root 실행) + # 2. /app / domain_policy.yaml container bind-mount 경로 + # 3. /app/../domain_policy.yaml container: /app 의 parent + # 4. .parent.parent.parent / yaml policy 패키지 기준 repo-root + candidates = [ + Path.cwd() / DEFAULT_POLICY_FILENAME, + Path("/app") / DEFAULT_POLICY_FILENAME, + Path("/app").parent / DEFAULT_POLICY_FILENAME, + Path(__file__).resolve().parent.parent.parent / DEFAULT_POLICY_FILENAME, + ] + for c in candidates: + if c.is_file(): + return c + # 찾지 못한 경우 첫 후보 반환 → 나중에 FileNotFoundError 로 명확히 실패 + return candidates[0] @lru_cache(maxsize=8) diff --git a/docker-compose.yml b/docker-compose.yml index e18ca3b..0195397 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -139,6 +139,7 @@ services: volumes: - ${NAS_NFS_PATH:-/mnt/nas/Document_Server}:/documents - ./config.yaml:/app/config.yaml:ro + - ./domain_policy.yaml:/app/domain_policy.yaml:ro - ./scripts:/app/scripts:ro - ./logs:/app/logs - ./migrations:/app/migrations:ro