Docker multi-stage build: образы в 10 раз меньше — иллюстрация к статье Storm Cloud Blog, категория Docker
Docker multi-stage build: образы в 10 раз меньше — иллюстрация к статье Storm Cloud Blog, категория Docker
Docker·2 мин··

Docker multi-stage build: образы в 10 раз меньше

Как уменьшить Docker-образ с 1 GB до 50 MB через multi-stage build. Примеры для Node.js и Go на VPS.

Образ на 1.2 GB — долгий деплой, много RAM, медленный pull. Multi-stage build решает это.


Проблема

Обычный Dockerfile:

FROM node:20
WORKDIR /app
COPY . .
RUN npm install && npm run build
CMD ["node", "dist/index.js"]

В образ попадают: node_modules, исходники, devDependencies. Итог — 800 MB–1.5 GB.


Решение: multi-stage

# Stage 1: build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Stage 2: production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]

Или для Go — финальный образ на scratch или alpine15–30 MB.


Сравнение

Подход Размер образа Время pull
Single-stage Node ~900 MB 2–5 мин
Multi-stage Node ~150 MB 30 сек
Multi-stage Go ~20 MB 5 сек

Советы для VPS

  • Используйте alpine базовые образы
  • Добавьте .dockerignore
  • Не копируйте node_modules — ставьте в build stage
  • Кэшируйте слои: сначала package.json, потом код

Итог

Multi-stage — must-have для production на VPS. Меньше образ = быстрее деплой и меньше расход диска.

Деплой контейнеров — Docker Compose на VPS. VPS для CI/CD — StormNet Cloud.

Частые вопросы

Зачем multi-stage build в Docker?

Финальный образ содержит только runtime — без компиляторов и dev-зависимостей. Образ меньше, атака поверхность уже.

Насколько уменьшается образ с multi-stage?

Часто в 5–10 раз: с 800 МБ до 80 МБ для Go/Node приложений — типичный результат.