73 lines
3.8 KiB
Docker
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
|
|
ENV POETRY_VIRTUALENVS_IN_PROJECT=1
|
|
ENV POETRY_VIRTUALENVS_CREATE=1
|
|
ENV 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"]
|