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
This commit is contained in:
51
Dockerfile
51
Dockerfile
@@ -17,10 +17,15 @@ 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
|
||||
ENV PATH="/opt/venv/bin:$PATH"
|
||||
RUN poetry install --no-interaction --no-ansi
|
||||
|
||||
# Устанавливаем зависимости в виртуальное окружение
|
||||
RUN /opt/venv/bin/pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Второй этап: runtime - финальный образ
|
||||
FROM python:3.12-slim
|
||||
@@ -28,6 +33,8 @@ FROM python:3.12-slim
|
||||
# Переводим в режим без буферизации для вывода логов
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
ENV PYTHONDONTWRITEBYTECODE=1
|
||||
# Установка PATH для виртуального окружения перед копированием
|
||||
ENV PATH="/opt/venv/bin:$PATH"
|
||||
|
||||
# Устанавливаем рабочую директорию
|
||||
WORKDIR /app
|
||||
@@ -35,14 +42,31 @@ 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 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
|
||||
@@ -51,7 +75,14 @@ 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"]
|
||||
# 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"]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user