# Dockerfile для Django приложения rosmorport_tsts # Многоэтапная сборка для оптимизации размера образа # Первый этап: builder - установка зависимостей FROM python:3.12-slim as builder # Переводим в режим без буферизации для вывода логов ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 # Устанавливаем poetry RUN pip install --no-cache-dir poetry==1.8.3 # Устанавливаем рабочую директорию WORKDIR /app # Копируем файлы с информацией о зависимостях COPY pyproject.toml poetry.lock* ./ # Создаем виртуальное окружение и устанавливаем зависимости RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" RUN poetry install --no-interaction --no-ansi # Второй этап: runtime - финальный образ FROM python:3.12-slim # Переводим в режим без буферизации для вывода логов ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 # Устанавливаем рабочую директорию WORKDIR /app # Копируем виртуальное окружение из builder COPY --from=builder /opt/venv /opt/venv # Добавляем путь к виртуальному окружению ENV PATH="/opt/venv/bin:$PATH" # Копируем содержимое проекта COPY . . # Создаём необходимые директории RUN mkdir -p /app/public/media /app/public/static /app/database # Устанавливаем пользователя для запуска приложения (из соображений безопасности) RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app USER appuser # Открываем порт EXPOSE 8000 # CMD - выполняет миграции, собирает статику и запускает Gunicorn # Использует sh для выполнения нескольких команд последовательно CMD ["sh", "-c", "cd /app/rosmorport_tsts && echo '>>> Applying database migrations...' && python manage.py migrate --noinput && echo '>>> Collecting static files...' && python manage.py collectstatic --noinput --clear && echo '>>> Starting Gunicorn...' && gunicorn --bind 0.0.0.0:8000 --workers 4 --worker-class sync --worker-tmp-dir /dev/shm --max-requests 1000 --timeout 60 --access-logfile - --error-logfile - rosmorport_tsts.wsgi:application"]