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? Жмите 🔥