Что такое multi-stage сборка в Docker и зачем она нужна?

Ответ

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

Основная цель — значительно уменьшить размер итогового Docker-образа, исключив из него всё ненужное для запуска приложения: инструменты сборки (компилятор Go, SDK), исходный код, временные файлы и зависимости.

Пример для Go-приложения:

# --- Этап 1: Сборка (Builder) ---
# Используем полный образ Go для компиляции
FROM golang:1.21-alpine as builder

# Устанавливаем рабочую директорию
WORKDIR /app

# Копируем файлы зависимостей и загружаем их
COPY go.mod go.sum ./
RUN go mod download

# Копируем исходный код и собираем бинарный файл
COPY . .
# Флаги -ldflags="-s -w" убирают отладочную информацию, уменьшая размер
RUN go build -ldflags="-s -w" -o myapp

# --- Этап 2: Финальный образ (Final) ---
# Используем минималистичный образ, не содержащий ничего лишнего
FROM alpine:latest

WORKDIR /root/

# Копируем только скомпилированный бинарник из предыдущего этапа (builder)
COPY --from=builder /app/myapp .

# Указываем команду для запуска приложения
CMD ["./myapp"]

Ключевые преимущества:

  • Минимальный размер образа: Образ builder может весить >500 МБ (включая Go SDK), а финальный образ на основе alpine — всего 10-15 МБ.
  • Повышение безопасности: Меньше компонентов в итоговом образе означает меньшую поверхность для атак.
  • Чистота и порядок: В финальном образе содержатся только артефакты, необходимые для работы приложения.