Мультистейдж билды
Используйте multi-stage builds, чтобы собрать приложение в одном контейнере, а продакшн-образ сделать минимальным:
# Сборка
FROM golang:1.22 as builder
WORKDIR /app
COPY . .
RUN go build -o app
# Продакшн
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/app .
CMD ["./app"]Минимизируйте базовые образы
Выбирайте облегчённые базовые образы:
- alpine вместо ubuntu
- distroless для максимальной безопасности и минимального веса
Оптимизируйте порядок слоёв
Чем выше изменяемость, тем ниже слой:
- Сначала COPY go.mod, npm package.json, установка зависимостей
- Потом COPY . . с кодом проекта
Это позволяет кэшировать большую часть слоёв даже при частых изменениях кода.
Убирайте за собой
Всегда удаляйте временные файлы и зависимости для сборки:
RUN apt-get install -y build-essential && \
make build && \
apt-get remove --purge -y build-essential && \
apt-get autoremove -y && \
apt-get cleanСжимайте образы
Используйте docker-slim, он автоматически оптимизирует образ, удаляя всё ненужное:
docker-slim build --http-probe my-app:latestКак применять и чего избегать
- В продакшне старайтесь держать образы <100MB
- Не добавляйте лишние пакеты “на всякий случай”
- Проверяйте образы на уязвимости: trivy image your-app:tag
MemOps🤨