We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

К списку статей

Построение мульти‑стадийных Docker‑образов для Laravel‑приложений: кэширование зависимостей, Composer‑parallel install и минимизация образа с Distroless

Разработка современных веб-приложений часто предполагает использование контейнеризации с Docker. Laravel, как один из популярных PHP-фреймворков, отлично подходит для развертывания в Docker. Однако, стандартные Dockerfile могут приводить к созданию больших образов, содержащих ненужные зависимости, что увеличивает время сборки и развертывания, а также потенциально расширяет поверхность атаки. В данной статье мы рассмотрим методы построения мульти‑стадийных Docker‑образов для Laravel-приложений, направленные на кэширование зависимостей, ускорение установки Composer и минимизацию размера итогового образа с использованием Distroless.

Мульти‑стадийные сборки: концепция

Мульти‑стадийные сборки позволяют использовать несколько FROM инструкций в одном Dockerfile. Каждая FROM инструкция начинает новую стадию. Ключевая идея заключается в том, чтобы использовать одну стадию для сборки приложения и его зависимостей, а затем скопировать только необходимые артефакты в финальный образ, который будет значительно меньше.

Кэширование зависимостей Composer

Установка зависимостей через Composer – одна из самых времязатратных операций при сборке Docker-образа. Кэширование зависимостей позволяет избежать повторной установки при каждом изменении кода, если composer.lock не изменился. Вот пример реализации:

FROM composer:2.5 AS composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-interaction --no-progress --no-scripts

В этом примере мы используем официальный образ Composer для установки зависимостей. Мы копируем только composer.json и composer.lock в образ. Если эти файлы не изменились, Docker использует кэш, и установка зависимостей не выполняется повторно. Обратите внимание на флаги: --no-interaction, --no-progress, и --no-scripts для автоматизации процесса и исключения интерактивных запросов.

Ускорение установки Composer с Composer-parallel install

Composer-parallel install позволяет значительно ускорить установку зависимостей, используя несколько процессов параллельно. Для этого необходимо установить пакет hirak/composer-package-bypass:

RUN composer global require hirak/composer-package-bypass

Затем, перед установкой зависимостей:

RUN composer dump-autoload -o
RUN composer install --no-interaction --no-progress --no-scripts --optimize-autoloader

Оптимизация автозагрузчика Composer также улучшает производительность приложения.

Минимизация образа с Distroless

Distroless – это набор базовых образов Docker, содержащих только необходимые зависимости для запуска приложения. Они не содержат пакетный менеджер, shell и другие утилиты, которые не нужны для работы приложения. Использование Distroless позволяет значительно уменьшить размер образа и повысить его безопасность.

После установки зависимостей Composer, мы копируем только необходимые файлы в финальный Distroless образ:

FROM php:8.2-fpm-alpine AS app
WORKDIR /var/www/html
COPY --from=composer /app/vendor ./vendor
COPY --from=composer /app/bootstrap ./bootstrap
COPY --from=composer /app/config ./config
COPY --from=composer /app/database ./database
COPY --from=composer /app/public ./public
COPY --from=composer /app/resources ./resources
COPY --from=composer /app/routes ./routes
COPY --from=composer /app/storage ./storage
COPY --from=composer /app/.env ./.env
COPY --from=composer /app/artisan ./artisan

RUN composer install --no-interaction --no-progress --no-scripts --optimize-autoloader

EXPOSE 9000
CMD ["php-fpm"]

В этом примере мы используем образ php:8.2-fpm-alpine в качестве базового. Мы копируем из стадии composer только директории vendor, bootstrap, config, database, public, resources, routes, storage, .env и artisan. Финальный образ будет содержать только необходимые файлы для запуска Laravel-приложения.

Полный Dockerfile

FROM composer:2.5 AS composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-interaction --no-progress --no-scripts

FROM php:8.2-fpm-alpine AS app
WORKDIR /var/www/html
COPY --from=composer /app/vendor ./vendor
COPY --from=composer /app/bootstrap ./bootstrap
COPY --from=composer /app/config ./config
COPY --from=composer /app/database ./database
COPY --from=composer /app/public ./public
COPY --from=composer /app/resources ./resources
COPY --from=composer /app/routes ./routes
COPY --from=composer /app/storage ./storage
COPY --from=composer /app/.env ./.env
COPY --from=composer /app/artisan ./artisan

RUN composer install --no-interaction --no-progress --no-scripts --optimize-autoloader

EXPOSE 9000
CMD ["php-fpm"]

Заключение

Использование мульти‑стадийных сборок, кэширование зависимостей Composer, параллельная установка и Distroless позволяет значительно оптимизировать Docker-образы для Laravel-приложений. Это приводит к уменьшению размера образа, ускорению сборки и развертывания, а также повышению безопасности. Помните о необходимости соблюдения требований законодательства РФ при разработке и развертывании веб-приложений, особенно в части обработки персональных данных.

РыбинскЛАБ предоставляет полный спектр услуг по разработке веб-приложений, включая настройку и оптимизацию Docker-окружения. Мы поможем вам создать надежное, безопасное и производительное решение, соответствующее всем современным требованиям и российскому законодательству. Свяжитесь с нами для обсуждения вашего проекта!

Материал подготовлен и отредактирован для практического применения. Перед внедрением в продакшен проверьте код и команды на своём окружении.

Поделиться материалом

Нужна сложная backend-разработка?

Проектирование архитектуры, PHP/Python backend, интеграции API, боты, автоматизация и оптимизация существующих систем.

Обсудить проект
Поддержать проект