Files
2026-etpgrf-site/Dockerfile
T

73 lines
3.8 KiB
Docker

# -----------------------------------------------------------------------------
# --- Этап 1: Сборщик (Builder) ---
# -----------------------------------------------------------------------------
# Используем официальный, но компактный образ Python как "строительную площадку".
# На этом этапе мы установим все зависимости, а потом скопируем только результат.
FROM python:3.13-slim as builder
# Устанавливаем переменные окружения для Poetry
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Эти настройки говорят Poetry создать виртуальное окружение прямо в папке проекта (/app/.venv)
ENV POETRY_NO_INTERACTION=1 \
POETRY_VIRTUALENVS_IN_PROJECT=1 \
POETRY_VIRTUALENVS_CREATE=1 \
POETRY_CACHE_DIR=/tmp/poetry_cache
# Устанавливаем саму Poetry
RUN pip install poetry
# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app
# Копируем только файлы зависимостей.
# Docker кэширует этот слой. Если эти файлы не меняются, Docker не будет
# переустанавливать все зависимости при каждой сборке.
COPY poetry.lock pyproject.toml ./
# Устанавливаем зависимости с помощью Poetry.
# --no-root: не устанавливать сам проект (etpgrf-site) как пакет.
# --only main: устанавливать только основные зависимости (не dev).
RUN poetry install --no-interaction --no-ansi --no-root --only main
# Очищаем кеш Poetry, чтобы он не попал в финальный образ.
RUN poetry cache clear --all -n
# -----------------------------------------------------------------------------
# --- Этап 2: Финальный образ ---
# -----------------------------------------------------------------------------
# Начинаем с такого же чистого и легкого образа Python.
FROM python:3.13-slim
# Устанавливаем рабочую директорию
WORKDIR /app
# Создаем непривилегированного пользователя для запуска приложения
RUN useradd -m -r appuser
# Устанавливаем владельца рабочей директории
RUN chown -R appuser:appuser /app
# Копируем готовое виртуальное окружение из сборщика
COPY --from=builder /app/.venv ./.venv
# Устанавливаем PATH, чтобы использовать python из .venv
ENV PATH="/app/.venv/bin:$PATH"
# Копируем весь код нашего приложения в рабочую директорию.
COPY . .
# Устанавливаем владельца для скопированных файлов
RUN chown -R appuser:appuser /app
# Переключаемся на непривилегированного пользователя
USER appuser
# Сообщаем Docker, что наше приложение будет работать на порту 8000.
# Это нужно для `docker-compose`.
EXPOSE 8000
# Команда запуска через Gunicorn (не обязательно. т.к. дублируется в docker-compose, но для чистоты образа
# на случай, если кто-то захочет запустить контейнер напрямую, а не через docker-compose, оставляем её здесь).
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--chdir", "/app/etpgrf_site", "etpgrf_site.wsgi"]