На что смотреть, если Docker образ слишком большой?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
На что смотреть, если 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/
Чеклист оптимизации
- Выберите slim/alpine образ вместо полного
- Используйте multi-stage build для разделения сборки и runtime
- Очищайте кэш после установки пакетов (--no-cache-dir, rm -rf)
- Удаляйте временные файлы в том же RUN слое
- Минимизируйте слои — объединяйте RUN команды
- Используйте .dockerignore для исключения ненужных файлов
- Проверяйте с dive/docker-slim для поиска скрытых больших файлов
- Оптимизируйте requirements.txt — удалите dev зависимости
Результаты оптимизации
Обычно можно добиться:
- Снижения на 50-70% правильной структурой Dockerfile
- Ускорения развёртывания на 2-3 раза
- Экономии места на сервере и registry
Эти подходы применяются в production и существенно улучшают CI/CD pipeline.