Что такое многоэтапные сборки (multi-stage builds) в Docker и зачем они нужны?

Ответ

Многоэтапная сборка (multi-stage build) — это возможность использовать несколько инструкций FROM в одном Dockerfile для разделения процесса сборки приложения и создания финального образа.

Основная цель — уменьшить размер итогового Docker-образа, исключив из него зависимости и инструменты, необходимые только для сборки (компиляторы, SDK, dev-зависимости).

Как это работает:

  1. Первый этап (сборщик): Используется базовый образ со всеми инструментами. В нем компилируется код, устанавливаются зависимости, собираются артефакты.
  2. Второй этап (финальный): Используется минималистичный базовый образ (например, alpine или -slim). В него копируются только необходимые для запуска артефакты из первого этапа с помощью флага --from.

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

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

WORKDIR /app

# Создаем виртуальное окружение
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

# Устанавливаем зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

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

WORKDIR /app

# Копируем только виртуальное окружение с зависимостями из этапа 'builder'
COPY --from=builder /opt/venv /opt/venv

# Копируем исходный код
COPY . .

# Указываем путь к исполняемым файлам из venv
ENV PATH="/opt/venv/bin:$PATH"

# Запускаем приложение
CMD ["python", "app.py"]

Преимущества:

  • Уменьшение размера образа: Финальный образ не содержит ненужных слоев с инструментами сборки.
  • Повышение безопасности: Меньше установленных пакетов — меньше потенциальных уязвимостей.
  • Упрощение CI/CD: Весь процесс сборки описан в одном Dockerfile.