Ответ
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 МБ. - Повышение безопасности: Меньше компонентов в итоговом образе означает меньшую поверхность для атак.
- Чистота и порядок: В финальном образе содержатся только артефакты, необходимые для работы приложения.