Ответ
Использование нескольких инструкций FROM
в одном Dockerfile активирует механизм мультистадийной сборки (multi-stage builds). Каждая инструкция FROM
начинает новый этап сборки, который может иметь свою собственную базовую среду.
Основная цель — уменьшить размер финального production-образа, исключив из него инструменты сборки, зависимости для разработки и промежуточные файлы.
Преимущества:
- Минимальный размер образа: В итоговый образ копируются только необходимые артефакты (например, скомпилированный бинарный файл или
node_modules
). - Повышение безопасности: Исключаются компиляторы, исходный код и утилиты, которые не нужны для работы приложения и могут содержать уязвимости.
- Упрощение CI/CD: Весь процесс сборки и упаковки описывается в одном Dockerfile.
Пример (сборка Go-приложения):
# --- Этап 1: Сборка (builder) ---
# Используем полный образ Go для компиляции
FROM golang:1.19 as builder
WORKDIR /app
COPY . .
# Собираем приложение. Флаги отключают CGO и создают статичный бинарник
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .
# --- Этап 2: Финальный образ (final) ---
# Используем минималистичный образ без лишних компонентов
FROM alpine:latest
WORKDIR /root/
# Копируем только скомпилированный бинарный файл из предыдущего этапа
COPY --from=builder /app/myapp .
# Указываем команду для запуска приложения
CMD ["./myapp"]
В этом примере итоговый образ будет основан на alpine
и содержать только один исполняемый файл myapp
, а не всю среду разработки Go.