# ============================================== # 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"]