Files
2024-test-rosmorport/Dockerfile
erjemin 792d152be2 feat: оптимизация Docker контейнера для разработки
Обновлен Dockerfile с двухэтапной сборкой, экспортом зависимостей через poetry, сборкой статики и удалением лишних файлов (экономия ~20МБ).
Обновлен docker-compose.yml с привязкой к localhost для безопасности.
Обновлен .dockerignore для исключения ненужных файлов (source maps, RTL CSS, TTF).
Добавлены таймауты SQLite в settings.py.
Минимальные параметры Gunicorn: 1 worker, timeout 30s, max-requests 100.
Тестировано и работает на http://localhost:8040
2026-03-31 18:57:33 +03:00

89 lines
4.9 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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* ./
# Экспортируем зависимости из poetry в requirements.txt
# Это более надежный способ в Docker, чем использование виртуального окружения poetry
RUN poetry export -f requirements.txt --output requirements.txt --no-interaction
# Создаем виртуальное окружение в стандартном месте
RUN python -m venv /opt/venv
# Устанавливаем зависимости в виртуальное окружение
RUN /opt/venv/bin/pip install --no-cache-dir -r requirements.txt
# Второй этап: runtime - финальный образ
FROM python:3.12-slim
# Переводим в режим без буферизации для вывода логов
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
# Установка PATH для виртуального окружения перед копированием
ENV PATH="/opt/venv/bin:$PATH"
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем виртуальное окружение из builder
COPY --from=builder /opt/venv /opt/venv
# Копируем содержимое проекта
COPY . .
# Создаём необходимые директории
RUN mkdir -p /app/public/media /app/public/static /app/database /app/staticfiles
# Собираем статику при сборке образа (для production)
# Это гарантирует что статика готова и не нужно запускать collectstatic при старте
# PATH уже установлен в переменных окружения выше, поэтому Django должен быть найден
RUN cd /app/rosmorport_tsts && \
python manage.py collectstatic --noinput --clear --no-input
# Оптимизация размера контейнера: удаляем лишние файлы статики
# Source maps нужны только для разработки
RUN find /app/staticfiles -name "*.map" -delete
# Удаляем RTL версии Bootstrap (если проект не поддерживает RTL)
RUN find /app/staticfiles -name "*rtl*" -type f -delete
# Удаляем TTF и EOT шрифты (используем только woff2 - меньше размер)
RUN find /app/staticfiles/webfonts -type f \( -name "*.ttf" -o -name "*.eot" -o -name "*.svg" \) -delete
# Удаляем неминифицированные версии CSS (кроме нашего собственного rosmorport.css)
# bootstrap.css, all.css, fontawesome.css используем только .min версии
RUN find /app/staticfiles/css -maxdepth 1 -name "*.css" -not -name "*.min.css" -not -name "rosmorport.css" -delete
# Устанавливаем пользователя для запуска приложения (из соображений безопасности)
RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app
USER appuser
# Открываем порт
EXPOSE 8000
# CMD - выполняет миграции и запускает Gunicorn
# Миграции выполняются при каждом запуске для гибкости
# Статика уже собрана при сборке образа
# Параметры оптимизированы для dev с минимальной нагрузкой:
# - bind 0.0.0.0:8000 (все интерфейсы контейнера, необходимо для Docker проброса портов)
# - workers=1 (один worker - достаточно для dev без нагрузок)
# - timeout=30 (сокращенный таймаут - запросы должны быть быстрыми)
# - max-requests=100 (перезагрузка воркера после 100 запросов - экономия памяти)
# - access-logfile/error-logfile '-' (логи в stdout для docker)
CMD ["sh", "-c", "cd /app/rosmorport_tsts && echo '>>> Applying database migrations...' && python manage.py migrate --noinput && echo '>>> Starting Gunicorn...' && gunicorn --bind 0.0.0.0:8000 --workers 1 --worker-class sync --worker-tmp-dir /dev/shm --max-requests 100 --timeout 30 --access-logfile - --error-logfile - rosmorport_tsts.wsgi:application"]