Ответ
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 и код приложения.