70 lines
2.5 KiB
Docker
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"]
|
|
|