Ответ
Многоэтапная сборка (multi-stage build) — это возможность использовать несколько инструкций FROM
в одном Dockerfile
для разделения процесса сборки приложения и создания финального образа.
Основная цель — уменьшить размер итогового Docker-образа, исключив из него зависимости и инструменты, необходимые только для сборки (компиляторы, SDK, dev-зависимости).
Как это работает:
- Первый этап (сборщик): Используется базовый образ со всеми инструментами. В нем компилируется код, устанавливаются зависимости, собираются артефакты.
- Второй этап (финальный): Используется минималистичный базовый образ (например,
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
.