
Многоэтапные сборки в Docker: как уменьшить образ с 1,2 ГБ до 50 МБ
dungle 19 минут назад Многоэтапные сборки в Docker: как уменьшить образ с 1,2 ГБ до 50 МБ Средний 13 мин 410 Блог компании Нетология DevOps * Node.JS * Системное администрирование * Веб-разработка * Туториал Знакомая...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. dungle 19 минут назад Многоэтапные сборки в Docker: как уменьшить образ с 1,2 ГБ до 50 МБ Средний 13 мин 410 Блог компании Нетология DevOps * Node. JS * Системное администрирование * Веб-разработка * Туториал Знакомая для многих картина: вы написали микросервис, набросали классический Dockerfile из четырёх команд, запустили сборку и получили на выходе Docker-образ 1 ГБ, а иногда и больше. В единичном случае это не кажется проблемой, но этот гигабайт гоняется по сети десятки раз в день.
Он качается при каждом коммите в CI, при развёртывании эфемерных preview-окружений и деплое в облачные кластеры. Для разработчиков, которые работают в нелокальных средах, утяжелённые образы — это потерянные минуты команды на ожидание пайплайнов и дополнительные расходы на трафик и хранение. Вместе с лишними гигабайтами в финальный образ попадают лишние системные пакеты, инструменты сборки, компиляторы и утилиты, которые могут принести с собой более 150 разных уязвимостей.
Технические детали
Обновление пакетов помогает не всегда: часть зависимостей лучше вообще не включать в финальный образ. Эта статья — практическое руководство, в котором мы расскажем, как уменьшить размер Docker-образа с помощью multi-stage сборок без переписывания кода приложения. С подготовкой статьи помог:Андрей ХомутовЭксперт-разработчик Центра компетенций по разработке мультимодальных ИИ-решений в Ростелеком ИТ, дипломный руководитель в Нетологии (Python, JS)TL;DRПроблема: тяжёлые образы замедляют доставку кода, увеличивают расходы на инфраструктуру и могут содержать лишние системные зависимости.
Решение: multi-stage builds разделяют этап сборки, где нужны компиляторы и инструменты разработки, и этап запуска, где остаётся только runtime-окружение. Результат: на примере Node. js-приложения покажем, как уменьшается Docker-образ без переписывания кода.
Бонус: шаблон Dockerfile, который можно адаптировать под свой проект. Почему Docker-образ может весить как операционная системаРазберём типичный Dockerfile для Node. js-приложения и посмотрим, из чего складываются лишние мегабайты.
Отраслевые последствия
Вот типичный набор слоёв, который оказывается внутри контейнера, если собрать его одной командой COPY . и обычным npm install:Полновесная ОС в базе (~1 ГБ). Популярный базовый Docker-образ FROM node:22 (или любой другой актуальный LTS) по умолчанию строится на базе полноценного дистрибутива Debian.
В нём развёрнуто всё: от утилит вроде curl, wget и git до менеджера пакетов apt и системных библиотек, о существовании которых ваше приложение даже не подозревает. Аналогичная проблема преследует и другие экосистемы, если использовать полные образы вместо специализированных (вроде python:slim). Dev-зависимости (сотни МБ).
Для разработки и тестирования вам необходимы typescript, eslint, jest, prettier и nodemon. Но в продакшене, когда код уже скомпилирован в чистый JavaScript, эти инструменты не выполняют ни одной строчки полезной работы. Тем не менее они упаковываются и отправляются на прод внутри папки node_modules.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





