uchill/backend/Dockerfile

70 lines
2.5 KiB
Docker

# ==============================================
# Dockerfile для Django Backend (оптимизирован)
# ==============================================
# Сборка: DOCKER_BUILDKIT=1 docker build ... (BuildKit включён по умолчанию в Docker 23+)
# syntax=docker/dockerfile:1
# ------------------------------
# Базовый образ Python
# ------------------------------
ARG PYTHON_VERSION=3.11
FROM python:${PYTHON_VERSION}-slim AS base
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
PIP_NO_CACHE_DIR=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_DEFAULT_TIMEOUT=100
WORKDIR /app
# Системные зависимости — один слой, очистка в том же RUN
# poppler-utils: pdftotext для конвертации PDF → txt при проверке ДЗ
RUN apt-get update && apt-get install -y --no-install-recommends \
postgresql-client \
gettext \
curl \
netcat-traditional \
poppler-utils \
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
# ==============================================
# Стадия зависимостей (кэш pip между сборками)
# ==============================================
FROM base AS dependencies
COPY requirements.txt /app/
# Кэш pip ускоряет повторные сборки при неизменных requirements
RUN --mount=type=cache,target=/root/.cache/pip \
pip install --upgrade pip && \
pip install -r requirements.txt
# ==============================================
# Финальная стадия
# ==============================================
FROM dependencies AS final
COPY . /app/
# Создание директорий для статики, медиа и профилей
RUN mkdir -p /app/staticfiles /app/media /app/profiles
# Создание непривилегированного пользователя
RUN useradd -m -u 1000 appuser && \
chown -R appuser:appuser /app
# Переключение на непривилегированного пользователя
USER appuser
# Открытие порта
EXPOSE 8000
# Healthcheck
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD curl -f http://localhost:8000/health/ || exit 1
# Команда запуска (будет переопределена в docker-compose)
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "4", "--threads", "2"]