1.1Kпросмотров
25.5%от подписчиков
14 февраля 2026 г.
Score: 1.2K
🐳 Docker для Python-разработчика (оптимизация образов) Твой Docker-образ весит 1.5 ГБ, а сборка каждый раз тянет все зависимости с нуля? Пора это исправить. Правильный Dockerfile экономит время, трафик и нервы. ⚡️ Выбор базового образа: slim vs alpine Главное правило: никогда не использовать python:latest. Он огромный. # ❌ Плохо: 1 ГБ+ FROM python:3.11 # ✅ Хорошо: ~200 МБ FROM python:3.11-slim # ✅ Для фанатов минимализма: ~100 МБ (но могут быть проблемы с компиляцией) FROM python:3.11-alpine ➡️ slim — урезанный Debian, alpine — минимальный Linux на musl libc. Для большинства проектов хватает slim. ✅ Многоступенчатая сборка (multi-stage): отделяем сборку от рантайма Зачем тащить в продакшен компиляторы и исходники? # Этап 1: сборка FROM python:3.11-slim as builder WORKDIR /app COPY requirements.txt . # Создаём один слой со всеми зависимостями RUN pip install --user --no-warn-script-location -r requirements.txt # Этап 2: финальный образ FROM python:3.11-slim WORKDIR /app # Копируем только установленные пакеты из builder COPY --from=builder /root/.local /root/.local # Копируем код COPY . . # Важно: добавляем путь к пакетам ENV PATH=/root/.local/bin:$PATH CMD ["python", "main.py"] ➡️ В финальном образе только нужные пакеты и твой код. Компиляторы, временные файлы и кэш pip остаются в builder. 🧪 Оптимизация кэширования зависимостей: почему Docker снова качает pandas? Docker кэширует слои. Если требования не меняются — не переустанавливай. FROM python:3.11-slim WORKDIR /app # 1. Копируем ТОЛЬКО requirements.txt COPY requirements.txt . # Этот слой кэшируется отдельно! # 2. Устанавливаем зависимости RUN pip install --no-cache-dir -r requirements.txt # 3. Копируем весь остальной код COPY . . # Этот слой пересобирается при любом изменении кода CMD ["python", "main.py"] ➡️ Docker кэширует слой RUN pip install... до тех пор, пока requirements.txt не изменится. Изменил одну строчку в коде — зависимости не переустанавливаются. 🔍 Убираем мусор: один RUN, меньше слоев Каждая команда в Dockerfile создаёт слой. Объединяй! # ❌ Плохо: 4 слоя, остаётся мусор RUN apt-get update RUN apt-get install -y gcc RUN pip install pandas RUN apt-get remove -y gcc # ✅ Хорошо: 1 слой, чисто RUN apt-get update && \ apt-get install -y --no-install-recommends gcc && \ pip install pandas && \ apt-get remove -y gcc && \ apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/ # Чистим кэш apt ➡️ Объединяй связанные команды через &&. Флаг --no-install-recommends ставит только необходимые пакеты. rm -rf /var/lib/apt/lists/ удаляет кэш пакетов. 🚀 Практический пример: итоговый оптимизированный Dockerfile Собираем FastAPI-приложение с зависимостями, включая компилируемые. # Этап сборки FROM python:3.11-slim as builder WORKDIR /app COPY requirements.txt . RUN pip install --user --no-warn-script-location -r requirements.txt # Этап рантайма FROM python:3.11-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 # Отключаем .pyc файлы # Не запускай от root! RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app USER appuser EXPOSE 8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] ➡️ Используем --no-warn-script-location чтобы не было предупреждений. PYTHONDONTWRITEBYTECODE=1 ускоряет запуск и экономит место. Запуск от не-root пользователя повышает безопасность. 🗣 Запомни: Используй slim-образы, многоступенчатую сборку и правильное кэширование зависимостей. Объединяй команды в один RUN и убирай за собой. Итоговый образ должен весить в 5-10 раз меньше первоначального. Полезен гайд по оптимизации Docker? Жмите 🔥
1.1K
просмотров
3762
символов
Да
эмодзи
Нет
медиа

Другие посты @pytstart

Все посты канала →
🐳 Docker для Python-разработчика (оптимизация образов) Твой — @pytstart | PostSniper