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