Разработка современных веб-приложений часто предполагает использование контейнеризации с 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-окружения. Мы поможем вам создать надежное, безопасное и производительное решение, соответствующее всем современным требованиям и российскому законодательству. Свяжитесь с нами для обсуждения вашего проекта!