# 멀티아키 backend 이미지 — llama-cpp-python 임베드 단일 프로세스. # 외부 추론 데몬·서비스 의존 없음. # # 빌드: # docker buildx build --platform linux/amd64,linux/arm64 -t kpaa-backend . # 또는 docker-compose가 알아서 (build: .) FROM python:3.11-slim AS base # Build deps for native wheels (lxml, llama-cpp-python sdist fallback). # llama-cpp-python은 보통 manylinux wheel을 받지만, arm64에서 빌드가 필요할 수 있어 # build-essential + cmake 포함. RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ cmake \ ca-certificates \ curl \ && rm -rf /var/lib/apt/lists/* ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ PIP_NO_CACHE_DIR=1 \ PYTHONUTF8=1 \ KPAA_HOST=0.0.0.0 \ KPAA_PORT=8000 # GPU offload 는 컨테이너 *런타임* 의 llama-cpp 빌드에 따라 자동 결정. # CPU 빌드 컨테이너: 자동 0. GPU 빌드 컨테이너: 자동 -1. # 강제 override 가 필요하면 docker-compose 의 environment 에 KPAA_N_GPU_LAYERS=... 추가. WORKDIR /app # 의존성 먼저 설치 (캐시 효율) COPY pyproject.toml README.md LICENSE NOTICE ./ COPY src/ ./src/ RUN pip install --upgrade pip \ && pip install '.[llm]' # 데이터 자산 (상담사례 스냅샷 동봉) COPY data/ ./data/ # 모델·법제처 캐시는 named volume으로 마운트 (도커가 처리) VOLUME ["/root/.cache/kpaa"] EXPOSE 8000 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD curl -fsS http://127.0.0.1:8000/healthz || exit 1 CMD ["python", "-m", "kpaa", "serve", "--host", "0.0.0.0", "--port", "8000"]