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 или alpine — 15–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 приложений — типичный результат.






