시크릿 유출 차단(핵심): - config.local.toml(OpenAI·DECODO·네이버 키)이 COPY . . 로 이미지에 구워지던 문제 — .dockerignore 제외 + 빌드 시 example(플레이스홀더) 복사로 대체. 실값은 compose env 주입(리포 루트 .env, 템플릿 .env.example) - DECODO_PORT_START/END/SESSION_MINUTES env override 추가 — 포트가 toml(플레이스홀더 0)에만 있으면 자격증명을 넣어도 프록시가 조용히 꺼지는 구멍 봉합 배포 견고화: - API Dockerfile 에 HEALTHCHECK(/healthz) 추가 - autoheal 컨테이너 추가 — compose restart 는 unhealthy 를 재시작하지 않으므로 라벨(autoheal=true) 기반 자동 재시작 담당 - 이미지 python 3.12→3.14 정렬(로컬 개발·테스트 환경과 일치) - API 이미지 경량화: requirements-api.txt 분리(크롤 의존성 제거, 330MB) 검증: 양 이미지 빌드 성공, 이미지 내 시크릿·.profiles 부재 확인, 무시크릿 API 이미지 스모크(healthz/readyz/HEALTHCHECK healthy) 통과 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
28 lines
1.2 KiB
Docker
28 lines
1.2 KiB
Docker
# LPS API 서버 이미지 — 요청 접수/조회만(브라우저 불필요, lean).
|
|
# 크롤은 별도 워커 이미지(Dockerfile.worker, Chromium+Xvfb)가 담당한다.
|
|
# 시크릿은 이미지에 굽지 않는다 — config 는 example(플레이스홀더)로 대체되고,
|
|
# 실제 값은 compose 의 env(DB_USER/DB_PASSWORD 등)로 주입된다(server_configs override).
|
|
FROM python:3.14-slim
|
|
|
|
WORKDIR /app
|
|
|
|
# 의존성 먼저 설치 (레이어 캐시 활용) — API 전용 경량 세트
|
|
COPY requirements-api.txt .
|
|
RUN pip install --no-cache-dir -r requirements-api.txt
|
|
|
|
COPY . .
|
|
|
|
# 시크릿 든 config.local.toml 은 .dockerignore 로 제외됨 → example(플레이스홀더)로 대체.
|
|
# 실값은 env 주입: DB_HOST/DB_USER/DB_PASSWORD/DB_NAME, PROCESS_COUNT, DB_CONNECTION_BUDGET …
|
|
RUN cp config/config.local.toml.example config/config.local.toml
|
|
|
|
# 항상 APP_ENV=local 로 실행 → config.local.toml(=example 사본) + env override.
|
|
ENV APP_ENV=local
|
|
|
|
EXPOSE 9600
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
|
|
CMD python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:9600/healthz', timeout=4).status==200 else 1)"
|
|
|
|
CMD ["python", "web_main.py"]
|