Python (with. Code)/Django-ninja

[Django Ninja] 배포용 도커파일 (Dockerfile)

yubi5050 2024. 4. 21. 15:31

Dockerfile 

  • 기본적으로 Multi-Builder 사용 (builder-image / runtime-image) 
  • 만약 linux 에서 제공하는 도구(vi 등)를 쓰고 싶다면 설치 후 runtime-image 에 복사 해야 함 
  • 프로젝트명 : mysite / 실행 log는 ./access.log 에 기록
  • 배포는 uvicorn에 gunicorn을 worker로 사용하여 실행 (worker 갯수는 cpu 코어 갯수 * 2)
  • 로컬에 배포 하고 싶다면 ${SERVER_IP} 를 수정 (ex. 127.0.0.1 / 0.0.0.0 )
#################### Server Build ####################
FROM python:3.11-slim AS builder-image
RUN apt-get update && apt-get install -y --no-install-recommends \
    locales rdate openssl ca-certificates libxml2 libmariadb-dev && \
    localedef -f UTF-8 -i ko_KR ko_KR.UTF-8 && \
    apt clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ENV PYTHONUNBUFFERED=1

# Install Packages
COPY requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

#################### Multi-stage Build ####################
FROM python:3.11-slim AS runtime-image

# Timezone 변경
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# Set Env
ENV PROJECT_NAME "mysite"
ENV SERVER_IP "0.0.0.0"
ENV SERVER_PORT 8000
ENV TZ='Asia/Seoul'
ENV LOG_PATH="./access.log"

# 파일 복사
COPY .local.env ./
COPY --from=builder-image /usr/local/bin /usr/local/bin
COPY --from=builder-image /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages

WORKDIR /usr/src/app
COPY . .

# django-ninja 실행
CMD gunicorn ${PROJECT_NAME}.asgi:application -k uvicorn.workers.UvicornWorker --workers 2 --access-logfile ${LOG_PATH} --bind ${SERVCER_IP}:${SERVER_PORT}