Docker-совет по оптимизации: уменьшите размер образа в несколько раз с помощью multi-stage build.
Многие образы весят сотни мегабайт, потому что в них остаются:
- компиляторы
- dev-зависимости
- временные файлы сборки
Но в продакшене нужен только готовый бинарь или собранное приложение.
Решение — многоэтапная сборка.
Идея:
1. В первом этапе — собираем проект
2. Во втором — копируем только результат
3. Всё лишнее остаётся в предыдущем слое и не попадает в финальный образ
Пример для Go:
# Stage 1 - сборка
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app
# Stage 2 - минимальный образ
FROM alpine:3.20
WORKDIR /app
COPY --from=builder /app/app .
CMD ["./app"]
Что это даёт:
- размер образа уменьшается в 5–20 раз
- быстрее pull и deploy
- меньше поверхность для уязвимостей
- быстрее запуск контейнеров
Аналогично работает для:
- Node (build → copy dist)
- Python (wheel → runtime)
- Java (build → copy jar)
Главная идея: в продакшен-образе должно быть только то, что нужно для запуска.