Multi-stage build в Docker: уменьшаем образ в 5 раз

Мы просто и по делу рассказываем про ИИ-инструменты для работы: сравнения, пошаговые гайды, бесплатные альтернативы и реальные сценарии применения. Помогаем выбрать между ChatGPT, Gemini, Claude, локальными моделями и десятками узкоспециализированных сервисов — от дизайна и HR до аналитики и SEO. Меньше хайпа, больше практики и экономии времени каждый день.

dockermulti-stagedockerfile

Большие 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.

🗣 Подборки каналов
🧠 Каталог ботов и приложений
🗺 Навигация

Читайте так же