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 '
가나다라마바사
' > /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"]