← Назад к вопросам

Что такое multi-stage building?

2.0 Middle🔥 151 комментариев
#Инфраструктура и DevOps

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Multi-Stage Building (Многоэтапная сборка)?

Multi-Stage Building — это продвинутая техника в разработке контейнерных приложений с использованием Docker, которая позволяет создавать оптимизированные и безопасные конечные образы путём разделения процесса сборки на несколько независимых этапов (стадий).

Основная идея и принцип работы

При классической сборке Docker-образа мы используем один Dockerfile, который содержит все инструкции: установку зависимостей, компиляцию кода, настройку среды и т.д. Это приводит к созданию монолитного образа, содержащего как инструменты сборки, так и итоговое приложение, что увеличивает размер образа и потенциальные векторы атаки.

Multi-stage сборка решает эту проблему, позволяя использовать несколько временных образов (stages) в одном Dockerfile. Каждый этап начинается с новой инструкции FROM и может использовать собственный базовый образ. Ключевой момент: вы можете копировать артефакты из одного этапа в другой, при этом в финальный образ попадают только необходимые файлы.

Преимущества multi-stage сборки

  1. Уменьшение размера итогового образа
    Инструменты сборки (компиляторы, пакетные менеджеры, dev-зависимости) остаются только в промежуточных этапах и не включаются в финальный образ.

  2. Повышение безопасности
    В продакшен-образ не попадают утилиты, которые могут быть использованы злоумышленниками. Уменьшается "атакующая поверхность".

  3. Улучшение производительности
    Docker может кэшировать каждый этап отдельно, что ускоряет повторные сборки.

  4. Упрощение организации
    Весь процесс сборки описывается в одном файле, а не разбивается на несколько скриптов.

Пример для PHP-приложения

Рассмотрим типичный случай для PHP Backend с зависимостями Composer:

# Первый этап: установка зависимостей
FROM composer:2 AS vendor
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader

# Второй этап: сборка фронтенда (если нужно)
FROM node:18 AS frontend
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY resources/assets ./resources/assets
RUN npm run production

# Третий этап: финальный образ
FROM php:8.2-fpm-alpine
WORKDIR /var/www/html

# Устанавливаем только необходимые PHP-расширения
RUN docker-php-ext-install pdo pdo_mysql opcache

# Копируем только нужные артефакты из предыдущих этапов
COPY --from=vendor /app/vendor ./vendor
COPY --from=frontend /app/public/build ./public/build

# Копируем исходный код приложения
COPY . .

# Настраиваем права и оптимизируем
RUN chown -R www-data:www-data /var/www/html \
    && php artisan config:cache \
    && php artisan route:cache

Ключевые аспекты реализации

  • Именование этапов: Каждый этап можно назвать с помощью AS <имя> после инструкции FROM. Это позволяет явно указывать, откуда копировать артефакты.
  • Выбор базовых образов: Для разных этапов можно использовать разные базовые образы. Например, для установки зависимостей Composer используется образ composer:2, а для финального приложения — минимальный образ php:8.2-fpm-alpine.
  • Копирование артефактов: Инструкция COPY --from=<этап> позволяет переносить только нужные файлы между этапами.
  • Оптимизация кэширования: Этапы, которые редко меняются (например, установка системных зависимостей), следует располагать выше в файле, чтобы использовать кэш Docker.

Практическое применение в Backend-разработке

Для PHP-разработчика multi-stage сборка особенно полезна при:

  • Работе с Composer: Dev-зависимости остаются в промежуточном контейнере
  • Компиляции расширений PHP: Инструменты компиляции не попадают в финальный образ
  • Оптимизации ассетов: Сборка фронтенда выполняется в отдельном этапе
  • Генерации кэша конфигурации: Кэширование роутов и конфигов выполняется на этапе сборки

Заключение

Multi-stage building — это не просто оптимизация размера образа, а комплексный подход к созданию безопасных, воспроизводимых и эффективных контейнеров для production-среды. Для PHP Backend-разработчика освоение этой техники позволяет существенно улучшить процесс доставки приложений, соответствовать современным стандартам контейнеризации и уменьшать эксплуатационные риски. Внедрение многоэтапной сборки особенно важно в микросервисных архитектурах, где количество контейнеров может исчисляться десятками или сотнями.