Что такое multi-stage builds в Docker и в чем их преимущество

Ответ

Multi-stage builds — это техника в Docker, позволяющая использовать несколько временных образов (стадий) в одном Dockerfile для сборки приложения, а в итоговый образ включать только необходимые для запуска артефакты.

Это решает проблему раздутых образов, содержащих зависимости сборки (компиляторы, dev-библиотеки) и исходный код.

Ключевые преимущества:

  • Минимальный размер итогового образа: В финальный образ попадает только скомпилированное приложение и его runtime-зависимости.
  • Повышение безопасности: Меньше компонентов в образе — меньше потенциальных уязвимостей.
  • Оптимизация процесса сборки: Dockerfile становится более читаемым и логически разделенным на этапы.

Пример Dockerfile для Python-приложения:

# --- Стадия 1: Сборка (builder) ---
# Используем полный образ Python для установки зависимостей
FROM python:3.9-slim as builder

WORKDIR /app

# Устанавливаем зависимости, включая те, что нужны только для сборки
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# --- Стадия 2: Финальный образ (final) ---
# Используем тот же легковесный базовый образ
FROM python:3.9-slim

WORKDIR /app

# Копируем только установленные зависимости из стадии 'builder'
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
# Копируем исходный код приложения
COPY . .

# Указываем команду для запуска
CMD ["python", "./main.py"]

В этом примере компиляторы и сборочные утилиты остаются в стадии builder и не попадают в финальный образ, который содержит только Python и код приложения.