Что такое multi-stage сборка в Docker и зачем она нужна?
Dockerfile и образы
Multi-stage сборка — это Dockerfile с несколькими блоками FROM: артефакты из промежуточных стадий копируются в финальный образ, а весь инструментарий сборки остаётся за бортом.
Пример
FROM node:20 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/htmlЧто это даёт
- В финальном образе нет компиляторов, dev-зависимостей и исходников: размер падает с гигабайта до десятков мегабайт.
- Меньше поверхность атаки: в проде нечего эксплуатировать.
- Одна команда
docker buildвместо внешних скриптов с промежуточными образами.
Нюансы
- Стадию можно собрать отдельно:
docker build --target builder— удобно для тестов в CI. - Именованные стадии (
AS builder) делаютCOPY --fromчитаемым. - Для интерпретируемых языков в финал копируют только production-зависимости и код приложения.
Коротко для собеседования
В одном Dockerfile описывают несколько стадий: тяжёлая собирает приложение, а лёгкая финальная получает только готовые артефакты через COPY --from. Итог — образ в разы меньше, без компиляторов и исходников, а промежуточную стадию можно собрать через --target для тестов в CI.