На прошлой неделе проводил урок по Docker на курсе по вайб-кодингу.
Студенты научились упаковывать свои приложения в контейнеры, но одну важную деталь я не успел подсветить.
Docker по умолчанию хранит ВСЁ:
- каждую сборку образа
- неиспользуемые volumes
- build cache
Всё это лежит мертвым грузом и жрет гигабайты.
За пару месяцев экспериментов легко накапливается 30-50 ГБ мусора!
Быстрое решение:
docker system prune
Эта команда удалит весь неиспользуемый хлам.
Но это только полдела.
Даже если регулярно чистить систему, Docker-образы могут быть раздутыми изначально.
Вот что реально уменьшает размер:
1️⃣ Используйте alpine-образы
python:3.14 весит 400+ МБ python:3.14-alpine весит 20+ МБВ 20 раз разница! А работает практически так же.
2️⃣ Объединяйте команды в RUN
Плохо:
RUN apt-get update
RUN apt-get install curl
RUN apt-get clean
Хорошо:
RUN apt-get update && \
apt-get install -y curl && \
apt-get clean
Каждый RUN - это новый слой в образе. Меньше слоев = меньше размер.
3️⃣ Добавьте .dockerignore
Без него в образ улетают:
- node_modules
- .git
- .env файлы
- всякий мусор
Это не только раздувает размер, но и может создать дыру в безопасности.
4️⃣ Multi-stage builds - это must-have
Собирайте приложение в одном контейнере, а в продакшн копируйте только результат:
# Сборка
FROM node:18 as builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# Продакшн
FROM node:18-alpine
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/index.js"]
В финальном образе нет dev-зависимостей, компилятора и прочего хлама.
Итого:
С такой оптимизацией образ легко сжимается с 600+ МБ до 50 МБ. Почти в 12 раз!
Это значит:
- быстрее CI/CD
- быстрее деплой
- дешевле хостинг
- меньше уязвимостей
А знаете, что самое приятное?
Вам не нужно во всём этом разбираться.
Достаточно правильно поставить задачу кодинг-агенту:
Оптимизируй мой Dockerfile, используй alpine, multi-stage build и .dockerignore
И он сделает всё за вас.
Попробуйте в Warp.dev - он понимает контекст вашего проекта и может сразу применить изменения.
А не как я - годами вручную ковырялся в Dockerfile'ах.
✔ @vibe_coding