Короткий ответ
Multi-stage build — это Dockerfile с несколькими инструкциями FROM, где промежуточные стадии (например, со средой компиляции) используются только для сборки артефакта, а в финальный образ через COPY --from= копируются только нужные готовые файлы — без инструментов сборки.
Как это работает подробнее
каждая FROM начинает новую именованную или нумерованную стадию со своим набором слоёв; инструкция COPY --from=STAGE позволяет взять файл из предыдущей стадии в текущую, не перенося остальное содержимое той стадии. Финальным образом становится только последняя стадия Dockerfile.
Пример кода
Dockerfile
FROM golang:1.22 AS builder
WORKDIR /src
COPY . .
RUN go build -o app .
FROM alpine:3.19
COPY --from=builder /src/app /usr/local/bin/app
CMD ["/usr/local/bin/app"]Что использовать на практике
- Практика. типичный пример — компилируемые языки (Go, Java, C++): первая стадия содержит компилятор и зависимости сборки (большой образ), вторая стадия — минимальный базовый образ (например,
alpineилиscratch), в который копируется только скомпилированный бинарник. Итоговый образ получается значительно меньше и не содержит инструментов сборки, что также снижает поверхность атаки.
Подводные камни
- Риск. забывают именовать стадии (
AS builder) и затем путаются при ссылках--from=0в сложных Dockerfile; копируют из builder-стадии больше файлов, чем нужно (например, весь/rootвместе с кэшами), раздувая итоговый образ без необходимости.