Большие Docker-образы дольше собираются, медленнее скачиваются и занимают лишнее место в registry. Multi-stage build решает эту проблему: вы собираете приложение в одном этапе, а в финальный образ кладёте только то, что нужно для запуска. Часто это действительно уменьшает размер в 3–5 раз и больше. 🚀
Что такое multi-stage build
Это подход, при котором в одном Dockerfile используется несколько этапов сборки:
- builder stage — установка зависимостей, компиляция, сборка артефактов
- runtime stage — минимальный образ только с готовым приложением
В финальный контейнер не попадают:
- компиляторы
- кеши пакетных менеджеров
- временные файлы
- dev-зависимости
Пример для Node.js
# Этап сборки
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Финальный этап
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/index.js"]
Почему образ становится меньше
На этапе builder остаётся всё тяжёлое: npm, dev-пакеты, исходники, инструменты сборки.
Во втором этапе — только production-зависимости и папка dist.
Например:
- обычный образ: 800–900 MB
- после multi-stage: 150–200 MB
Главные плюсы ✅
- Меньше размер образа — быстрее pull/push
- Выше безопасность — меньше лишних пакетов и уязвимостей
- Чище production — внутри контейнера только нужные файлы
- Удобнее CI/CD — меньше трафика и быстрее деплой
Практические советы
- Используйте лёгкие базовые образы:
alpine,distroless, slim-версии - Добавьте
.dockerignore, чтобы не копироватьnode_modules,.git, логи - Сначала копируйте
package.json/requirements.txt, потом остальной код — это улучшает кеширование - Не храните секреты внутри образа
- Проверяйте размер командой:
docker imagesКогда multi-stage build особенно полезен
- Go, Rust, Java, .NET — где есть компиляция
- Frontend-проекты с
npm run build - Python-приложения с отдельной сборкой зависимостей
- Любые сервисы, где важны скорость деплоя и экономия ресурсов
Вывод
Multi-stage build — это простой способ сделать Docker-образ меньше, безопаснее и быстрее. Для production это уже не “оптимизация на потом”, а хорошая инженерная практика. 🔧📦
👀 Ниже стоит посмотреть подборку каналов про IT — там часто публикуют такие же практические разборы по Docker, DevOps и backend.