Оптимизация развертывания с помощью многостадийных сборок контейнеров
Проблема больших образов контейнеров
При поставке полной системы размер образа быстро становится огромным. Это включает в себя среду сборки и тестирования. Даже если извлечение необходимых файлов не составляет проблемы, процесс занимает много времени.
Контейнеры позволяют автоматизировать этот процесс. В одном Dockerfile можно определить несколько стадий сборки. Хороший пример — веб-сайт на JavaScript, собираемый с помощью Node.js.
Пример размеров
- Node.js: ~400–600 МБ
- Веб-сервер nginx: ~20 МБ
- Сайт: ~2 МБ
Полный образ системы весит более 600 МБ, хотя для производства нужно только 22 МБ (nginx + сайт). Кроме того, наличие лишнего ПО создает риски безопасности. Решение — многостадийная сборка (multi-stage build).
Принцип многостадийной сборки
В многостадийной сборке в одном файле определяются несколько контейнеров, и только необходимые данные передаются из одной стадии в другую.
Пример Dockerfile для Node.js
Первая стадия содержит Node.js как систему сборки, вторая — веб-сервер, который копирует артефакты сборки из первой стадии.
## Базовая система Стадия 1 ## Используем официальный образ Node.js FROM node:8.11.3 as buildsystem ## Добавляем исходный код из Git-проекта COPY ./source /root/frontend ## Собираем фронтенд с Node.js WORKDIR /root/frontend/ RUN npm install \ && npm run build ##################################################################### ##################################################################### ## Базовая система Стадия 2 ## Используем легкий образ nginx на базе Alpine FROM nginx:alpine ## Копируем сборку из стадии 1 RUN mkdir -p /var/www/html/<MyApp> COPY --from=buildsystem /root/frontend/dist/ /var/www/html/<MyApp>/ ## Добавляем конфигурацию nginx по умолчанию ADD default.conf /etc/nginx/conf.d/ ## Публикуем порт EXPOSE 80 ## Запускаем nginx CMD ["nginx", "-g", "daemon off;"]
Результат и преимущества
Получается маленький контейнер только с необходимым. Мы используем очень легкий дистрибутив Linux — Alpine для nginx.
Дополнительное преимущество: используются готовые официальные образы, их не нужно создавать и поддерживать самостоятельно. Для обновлений системы достаточно регулярно заменять базовые образы. Всё это прекрасно автоматизируется в пайплайне с GitLab или другими инструментами.
Промышленные технологии
- Построение доверия с бизнес-лидерами: выбор правильных облачных сервисов
- Умножение и деление в научной нотации: правила и примеры
- Индустрия 4.0: Интервью с Вереной Майюктке из Bosch.IO об IoT, автоматизации и фабрике будущего
- Создайте свой первый IoT-проект с Raspberry Pi, DHT11 и ThingSpeak
- Microsoft представил рекордную языковую модель на 17 млрд параметров
- AI-дорожные карты: стратегическое руководство для компаний цепочек поставок
- Умные закупки: слияние ИИ с человеческим инсайтом
- Эффективные контейнерные краны: точная погрузка и разгрузка для портов и ж/д узлов
- Эффективная сборка ARM-контейнеров на x86 системах
- Оптимизация развертывания с помощью многостадийных сборок контейнеров