ai_invest/backend/fastapi/Dockerfile-fastapi

122 lines
4.3 KiB
Plaintext

FROM python:3.11
WORKDIR /app
# 기본 패키지 설치 (MySQL, 빌드 도구, 로케일)
RUN apt-get update && apt-get install -y \
default-libmysqlclient-dev \
build-essential \
pkg-config \
locales \
wget \
unzip \
ca-certificates \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Selenium 및 Chrome 관련 패키지 설치
RUN apt-get update && apt-get install -y \
libnss3 \
libxss1 \
libappindicator3-1 \
fonts-liberation \
libasound2 \
libnspr4 \
libdbus-1-3 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libcups2 \
libdrm2 \
libgbm1 \
libgtk-3-0 \
libpango-1.0-0 \
libcairo2 \
libatspi2.0-0 \
chromium \
chromium-driver \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# 폰트 관련 패키지 설치 (기본)
RUN apt-get update && apt-get install -y \
fontconfig \
fonts-dejavu-core \
fonts-liberation \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# 한글 폰트 설치 (최소한으로 안전하게)
RUN apt-get update && \
apt-get install -y fonts-dejavu && \
(apt-get install -y fonts-nanum || true) && \
(apt-get install -y fonts-noto-cjk || true) && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# ChromeDriver 설치
RUN wget https://storage.googleapis.com/chrome-for-testing-public/127.0.6533.88/linux64/chromedriver-linux64.zip \
&& unzip chromedriver-linux64.zip -d /usr/local/bin/ \
&& rm chromedriver-linux64.zip \
&& mv /usr/local/bin/chromedriver-linux64/chromedriver /usr/local/bin/chromedriver \
&& rm -rf /usr/local/bin/chromedriver-linux64
# MeCab 한국어 형태소 분석기 설치
RUN wget https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz \
&& tar -xzf mecab-0.996-ko-0.9.2.tar.gz \
&& cd mecab-0.996-ko-0.9.2 \
&& ./configure \
&& make \
&& make install \
&& ldconfig \
&& cd .. \
&& rm -rf mecab-0.996-ko-0.9.2*
# 한국어 로케일 설정
RUN sed -i -e 's/# ko_KR.UTF-8 UTF-8/ko_KR.UTF-8 UTF-8/' /etc/locale.gen \
&& locale-gen
# 한국어 로케일 환경 변수 설정
ENV LANG=ko_KR.UTF-8
ENV LANGUAGE=ko_KR:ko
ENV LC_ALL=ko_KR.UTF-8
ENV PYTHONIOENCODING=utf-8
ENV PYTHONENCODING=utf-8
# 폰트 캐시 업데이트 및 WeasyPrint 폰트 설정
RUN fc-cache -fv \
&& echo "폰트 설치 확인:" \
&& fc-list :lang=ko | head -10 \
&& echo "WeasyPrint 테스트용 HTML 생성 및 PDF 변환 테스트" \
&& printf '<!DOCTYPE html><html><head><meta charset="UTF-8"><style>body{font-family:"Nanum Gothic",NanumGothic,"Noto Sans CJK KR",sans-serif;}</style></head><body><h1>한글 테스트</h1><p>가나다라마바사</p></body></html>' > /tmp/test_korean.html
COPY ./app /app
# document_files 디렉토리 생성 및 sn3hcv 파일 변환기 복사
RUN mkdir -p /home/user1/yjh/fastapi/document_files
COPY ./document_files /home/user1/yjh/fastapi/document_files
# pip 업그레이드 & Selenium 별도 설치 (버전 고정, no-cache-dir로 캐시 피함, retry 추가)
RUN pip install --upgrade pip --no-cache-dir \
&& pip install selenium==4.10.0 webdriver-manager --no-cache-dir --retries 10 --timeout 60
# PDF 변환 도구들 설치 (WeasyPrint 및 pdfkit 지원)
RUN apt-get update && \
(apt-get install -y libpango-1.0-0 || true) && \
(apt-get install -y libpangocairo-1.0-0 || true) && \
(apt-get install -y libgdk-pixbuf2.0-0 || true) && \
(apt-get install -y wkhtmltopdf || true) && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# Python 패키지 설치
RUN pip install -r requirements.txt --no-cache-dir --retries 10 --timeout 60
# =============================================================================
# 포트 설정
# - 컨테이너 내부에서는 8097 포트 사용 (표준화)
# - 외부 포트는 docker-compose에서 매핑
# =============================================================================
EXPOSE 8097
# =============================================================================
# 서버 시작 명령어
# - uvicorn: ASGI 서버 (FastAPI 권장)
# - 워커 수: CPU 코어 수의 2-4배가 적절 (예: 4코어 = 8-16 워커)
# - 비동기 처리로 적은 워커로도 많은 동시 요청 처리 가능
# =============================================================================
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8097", "--workers", "4"]