Какие существуют способы уменьшения размера Docker-образа?

«Какие существуют способы уменьшения размера Docker-образа?» — вопрос из категории Devops, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Уменьшение размера Docker-образа критически важно для ускорения развертывания, снижения затрат на хранение и повышения безопасности. Вот ключевые методы:

  1. Выбор минимального базового образа. Начинайте с самого легковесного образа, который подходит для вашего приложения. Вместо ubuntu или python:latest используйте их alpine или slim версии.

    # Хорошо: использует slim-версию
    FROM python:3.10-slim-bullseye
  2. Использование многоэтапной сборки (Multi-stage builds). Это самый эффективный метод. Он позволяет отделить среду сборки (с компиляторами, dev-библиотеками) от финальной среды выполнения, куда копируются только необходимые артефакты.

    # Этап 1: Сборка
    FROM golang:1.19 as builder
    WORKDIR /app
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -o myapp
    
    # Этап 2: Финальный образ
    FROM alpine:latest
    WORKDIR /root/
    # Копируем только скомпилированный бинарный файл
    COPY --from=builder /app/myapp .
    CMD ["./myapp"]
  3. Очистка кэша и временных файлов в одном слое. Команды установки пакетов следует объединять с командами очистки через &&, чтобы мусор не оставался в промежуточных слоях.

    # Правильно: установка и очистка в одной команде RUN
    RUN apt-get update && 
        apt-get install -y --no-install-recommends gcc && 
        rm -rf /var/lib/apt/lists/*
  4. Эффективное использование .dockerignore. Создайте файл .dockerignore, чтобы исключить из контекста сборки ненужные файлы и директории (.git, node_modules, __pycache__, локальные конфиги). Это ускоряет сборку и уменьшает размер образа.

    
    .git
    .vscode
    __pycache__/
    *.pyc
    README.md
    ```javascript
  5. Объединение команд RUN. Каждая инструкция RUN создает новый слой. Группируйте связанные команды, чтобы минимизировать количество слоев.

Для глубокого анализа слоев и поиска "мусора" в образе рекомендуется использовать утилиты вроде dive.