Ответ
Multi-stage сборка — это метод создания Docker-образов, который использует несколько этапов (FROM) в одном Dockerfile. Ключевая цель — отделить среду сборки (с компиляторами, SDK, зависимостями) от среды выполнения, чтобы итоговый образ содержал только необходимые артефакты.
Как это работает:
- Этап сборки (builder stage): Используется базовый образ с полным набором инструментов (например,
golang:1.21,maven:3.8). Здесь выполняется компиляция, сборка и тестирование кода. - Финальный этап (runtime stage): Используется минимальный базовый образ (например,
alpine:latest,scratch). Из предыдущих этапов с помощью инструкцииCOPY --from=<stage>копируются только готовые бинарники, библиотеки или статические файлы.
Пример для Go-приложения:
# Этап 1: Сборка
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /myapp ./cmd/app
# Этап 2: Запуск
FROM alpine:latest AS runtime
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /myapp .
EXPOSE 8080
CMD ["./myapp"]
Преимущества:
- Значительно меньший размер образа: Итоговый образ не содержит компиляторов, исходного кода и промежуточных файлов сборки.
- Повышенная безопасность: Уменьшается поверхность атаки (меньше пакетов, меньше потенциальных уязвимостей).
- Лучшее использование кэша Docker: Изменения в коде приложения не инвалидируют кэш слоев для скачивания зависимостей на этапе
go mod download. - Четкое разделение ответственности:
Dockerfileявно описывает и сборку, и деплой.