← Назад к вопросам

На что смотреть, если Docker образ слишком большой?

1.8 Middle🔥 181 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

На что смотреть, если Docker образ слишком большой

Великий образ замедляет развёртывание, увеличивает время загрузки и использует больше места на сервере. Нужна систематическая диагностика для выявления узких мест.

1. Анализ размера слоёв Dockerfile

Сначала посмотрите на历史 образа:

# История слоёв образа
docker history my-app:latest

# С форматированием
docker history --human --no-trunc my-app:latest

Порядок вывода — от последнего слоя к первому. Каждый слой RUN, COPY, ADD увеличивает размер.

2. Используйте инструменты для анализа

docker-slim — лучший инструмент для оптимизации:

# Установка
curl -sL https://raw.githubusercontent.com/slimtoolkit/slim/master/scripts/install-slim.sh | sudo -E bash -s

# Анализ образа
docker-slim build --report my-app:latest

# Результат покажет:
# - Какие файлы не используются
# - Чем может быть меньше образ
# - Рекомендации по оптимизации

dive — интерактивный обозреватель слоёв:

# Установка: https://github.com/wagoodman/dive
dive my-app:latest

Визуально видите, какие файлы в каком слое и почему образ большой.

3. Типичные источники больших образов

Кэш pip/apt:

# ❌ Плохо — оставляет кэш в образе
RUN apt-get update && apt-get install -y python3-dev
RUN pip install -r requirements.txt

# ✅ Хорошо — очищает кэш
RUN apt-get update && apt-get install -y python3-dev && \\
    rm -rf /var/lib/apt/lists/* /var/cache/apt/*
RUN pip install --no-cache-dir -r requirements.txt

Большие промежуточные файлы:

# ❌ Плохо
RUN wget large-file.tar.gz && tar -xzf large-file.tar.gz

# ✅ Хорошо — удалить архив
RUN wget large-file.tar.gz && \\
    tar -xzf large-file.tar.gz && \\
    rm large-file.tar.gz

Неиспользуемые зависимости:

# requirements.txt — удалите dev зависимости для production
# Используйте requirements-prod.txt вместо requirements.txt

4. Multi-stage сборка

Это главный инструмент снижения размера:

# Этап 1: Сборка
FROM python:3.11-slim as builder

WORKDIR /app
COPY requirements.txt .

# Кэш pip останется только в промежуточном образе
RUN pip install --no-cache-dir --user -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", "app.py"]

Разница может быть в 2-3 раза!

5. Выбор базового образа

# ❌ Большой
FROM ubuntu:22.04          # ~80 МБ

# ❌ Средний
FROM python:3.11           # ~900 МБ

# ✅ Хороший
FROM python:3.11-slim      # ~150 МБ

# ✅ Очень маленький
FROM python:3.11-alpine    # ~50 МБ

Осторожно с alpine — может быть нестабильней для Python зависимостей.

6. Проверка содержимого образа

# Запустить контейнер и посмотреть содержимое
docker run --rm -it my-app:latest /bin/bash

# Найти большие файлы
find / -type f -size +50M 2>/dev/null

# Проверить размер папок
du -sh /*

7. Оптимизация .dockerignore

# .dockerignore
__pycache__
*.pyc
*.pyo
*.pyd
.Python
venv/
.git
.gitignore
.env
.vscode
*.log
.pytest_cache
.coverage
dist/
build/
*.egg-info/

Чеклист оптимизации

  1. Выберите slim/alpine образ вместо полного
  2. Используйте multi-stage build для разделения сборки и runtime
  3. Очищайте кэш после установки пакетов (--no-cache-dir, rm -rf)
  4. Удаляйте временные файлы в том же RUN слое
  5. Минимизируйте слои — объединяйте RUN команды
  6. Используйте .dockerignore для исключения ненужных файлов
  7. Проверяйте с dive/docker-slim для поиска скрытых больших файлов
  8. Оптимизируйте requirements.txt — удалите dev зависимости

Результаты оптимизации

Обычно можно добиться:

  • Снижения на 50-70% правильной структурой Dockerfile
  • Ускорения развёртывания на 2-3 раза
  • Экономии места на сервере и registry

Эти подходы применяются в production и существенно улучшают CI/CD pipeline.

На что смотреть, если Docker образ слишком большой? | PrepBro