Files
2026-etpgrf-site/Dockerfile
T

72 lines
3.5 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
# ENTRYPOINT и CMD не указываем, так как команда запуска
# будет передана из docker-compose.prod.yml (docker-compose.yml).