양파개발자 실바의 블로그

Django Celery Dockerfile

Django Celery 워커를 위한 Dockerfile입니다. 멀티 스테이지 빌드를 사용하여 최적화된 이미지를 생성합니다.


1. Dockerfile 내용

# 베이스 이미지 선택 (Python 3.12)
FROM python:3.12-slim AS builder

# 시스템 패키지 설치 (postgresql)
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    libpq-dev \
    python3-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 작업 디렉토리 생성
WORKDIR /app

# Python 패키지 설치
COPY requirements.txt /app/
RUN pip install --no-cache-dir --upgrade pip && \
    pip install --no-cache-dir --prefer-binary -r requirements.txt

# 멀티 스테이지 빌드 ==================
FROM python:3.12-slim


# 환경 변수 정의
ARG SERVICE_ENV="local"
ARG USERNAME="appuser"
ARG LOG_LEVEL="INFO"
ARG CELERY_QUEUE="celery-queue-${SERVICE_ENV}"
ARG CELERY_OPTION="--concurrency=1"

ENV SERVICE_ENV=${SERVICE_ENV}
ENV USERNAME=${USERNAME}
ENV LOG_LEVEL=${LOG_LEVEL}
ENV CELERY_QUEUE=${CELERY_QUEUE}
ENV CELERY_OPTION=${CELERY_OPTION}

# 최종 스테이지에 필요한 시스템 패키지 설치 (postgresql, ps, vi)
RUN apt-get update && apt-get install -y --no-install-recommends \
    libpq-dev \
    procps \
    vim \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Global 환경 변수 설정
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV DJANGO_SETTINGS_MODULE=root_app.settings.default
ENV PATH="/usr/local/bin:$PATH"

WORKDIR /app

COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY . /app/
COPY ./deploy/dockerfiles/service_celery/entrypoint.sh /app/

# 환경별 설정 파일 복사 (.env)
COPY dotenv/${SERVICE_ENV}.conf /app/.env
RUN rm -rf /root/.cache /tmp/*

# Celery 사용자 및 그룹 생성 (보안 강화)
RUN groupadd -r ${USERNAME} && useradd -r -g ${USERNAME} ${USERNAME}
RUN chown -R ${USERNAME}:${USERNAME} /app
USER ${USERNAME}


RUN chmod +x /app/entrypoint.sh
CMD ["/bin/sh", "-c", "exec /app/entrypoint.sh ${LOG_LEVEL} ${CELERY_QUEUE} ${CELERY_OPTION}"]

2. 주요 특징

  • 멀티 스테이지 빌드: 빌드 단계와 런타임 단계를 분리하여 이미지 크기 최적화
  • 환경 변수 설정: Celery 큐, 로그 레벨, 옵션 등을 환경 변수로 설정
  • 보안 강화: 전용 사용자로 Celery 워커 실행
  • Entrypoint 스크립트: Celery 워커를 안전하게 시작/종료하는 스크립트 사용