Что такое Multi-stage сборка образа в Docker?

«Что такое Multi-stage сборка образа в Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Multi-stage сборка — это метод создания Docker-образов, который использует несколько этапов (FROM) в одном Dockerfile. Ключевая цель — отделить среду сборки (с компиляторами, SDK, зависимостями) от среды выполнения, чтобы итоговый образ содержал только необходимые артефакты.

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

  1. Этап сборки (builder stage): Используется базовый образ с полным набором инструментов (например, golang:1.21, maven:3.8). Здесь выполняется компиляция, сборка и тестирование кода.
  2. Финальный этап (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 явно описывает и сборку, и деплой.