У меня есть приложение Laravel. Из-за нагрузки на наше серверное кэширование мы переключились с Redis с одним экземпляром на кластер Redis.
Проблемы начались здесь, на моем устройстве все работает нормально, но когда мы нажимаем на промежуточную или производственную среду, процесс сборки завершается сбоем при сборке докера точно при установке RUN composer.
RUN composer install
мы используем этот файл докера и другой файл докера в качестве базового образа
FROM registry.shenoto.net/devops/base-images/php-base-8.1:latest
COPY .docker/php.ini /usr/local/etc/php/conf.d/php.ini
COPY .docker/php-fpm.conf /usr/local/etc/php-fpm.d/www.conf
COPY .docker/nginx.conf /etc/nginx/http.d/default.conf
COPY .docker/supervisor.conf /etc/supervisor/conf.d/supervisor.conf
COPY --chown=www-data . /var/www/html/
RUN composer install
это ошибка на CI\CD
#12 9.927 - Installing spatie/laravel-ignition (1.6.4): Extracting archive
#12 9.927 - Installing php-amqplib/php-amqplib (v3.5.1): Extracting archive
#12 9.928 - Installing vladimir-yuldashev/laravel-queue-rabbitmq (v13.1.0): Extracting archive
#12 9.961 0/132 [>---------------------------] 0%
#12 10.11 19/132 [====>-----------------------] 14%
#12 10.23 29/132 [======>---------------------] 21%
#12 10.36 41/132 [========>-------------------] 31%
#12 10.58 60/132 [============>---------------] 45%
#12 10.71 69/132 [==============>-------------] 52%
#12 10.92 81/132 [=================>----------] 61%
#12 11.15 95/132 [====================>-------] 71%
#12 11.50 114/132 [========================>---] 86%
#12 11.67 124/132 [==========================>-] 93%
#12 11.81 132/132 [============================] 100%
#12 12.37 Generating optimized autoload files
#12 19.30 > Illuminate\Foundation\ComposerScripts::postAutoloadDump
#12 19.33 > @php artisan package:discover --ansi
#12 20.30
#12 20.30 RedisClusterException
#12 20.30
#12 20.30 Couldn't map cluster keyspace using any provided seed
#12 20.30
#12 20.30 at [internal]:0
#12 20.30 1▕
#12 20.31
#12 20.31 1 Modules/Core/Service/RedisConnector.php:17
#12 20.31 ErrorException::("RedisCluster::__construct(): php_network_getaddresses: getaddrinfo for redis-node-1 failed: Name does not resolve")
#12 20.31
#12 20.31 2 Modules/Core/Service/RedisConnector.php:17
#12 20.31 RedisCluster::__construct("bitnami")
#12 20.32 Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1
#12 ERROR: process "/bin/sh -c composer install" did not complete successfully: exit code: 1
и это класс RedisConnector
class RedisConnector
{
public static function create()
{
return new RedisCluster(NULL, array(
"redis-node-5:6379",
"redis-node-4:6379",
"redis-node-3:6379",
"redis-node-2:6379",
"redis-node-1:6379",
), 1.5, 1.5, true, "bitnami");
}
}
Я попытался добавить redis-node-5,redis-node-4,... в /etc/host в среде сборки, это сработало, но я не думаю, что это хорошее решение этой проблемы, когда мы переключаем сервер сборки или добавить больше узлов, их перенастройка требует времени. Я знаю, что это можно автоматизировать, но я ищу более простое решение.






Если вы больше не считаете, что подделка записей имени хоста является адекватной (ИМХО, сборка не должна требовать этого для запуска), вы можете отделить конфигурацию хоста от конфигурации сборки (редакции приложения), не запуская скрипты композитора (и плагины) во время строить.
RUN composer --no-interaction install --no-plugins --no-scripts
Это эффективно предотвращает запуск события post-autoload-dump, которое вызывает преждевременный запуск
#12 19.30 > Illuminate\Foundation\ComposerScripts::postAutoloadDump
#12 19.33 > @php artisan package:discover --ansi
И это также рекомендуемый способ запуска composer install во время сборки CI для создания артефакта версии приложения.
Это не серебряная пуля, так как вам все равно нужно выполнить шаги по настройке перед развертыванием. Просто ваш артефакт (здесь изображение докера) остается универсальным, и вы можете выбрать систему, в которой вы развернете его позже (локальная, промежуточная, производственная; один, три или пять узлов Redis и т. д.).
Обратитесь к руководствам по развертыванию и настройке используемой вами версии и модулей Laravel и привяжите соответствующие команды на этапе развертывания / позвольте вашему агенту развертывания обработать их. Docker-образ их еще не видел.
Вы уже можете подготовить разделение, выполнив явный дамп автозагрузки, но с доступными скриптами:
RUN composer --no-interaction install --no-plugins --no-scripts
RUN composer dump-autoload
composer dump-autoload существует только для запуска настроенных сценариев, поэтому он сохраняет прежнее поведение. Автозагрузчик уже создан предыдущей командой composer install.
Затем вы можете сосредоточиться на том, чтобы избавиться от него (просто примените правильную конфигурацию без ошибок или настройте позже). Для RedisConnector мне кажется, что это зависит от фактической конфигурации и нуждается в некоторой форме шаблонов. Возможно, php artisan package:discover делает это, но это может быть побочным эффектом или только состоянием гонки, у меня нет подробного представления о таком проекте Laravel, а затем и о вашем.
После этого рассмотрите оптимизацию автозагрузчика во время composer install в Dockerfile. Это также может зависеть от конфигурации хоста, поэтому может быть частью развертывания, а не сборки, и еще одним хорошим упражнением.
/Редактировать:
Затем вы можете подумать о том, как многоэтапные сборки Docker (тестирование отдельно) могут помочь вам управлять различными этапами (сборка ревизии / конкретная конфигурация среды выполнения). Здесь нет жестких правил, у вас всегда есть неявная конфигурация по умолчанию в вашем приложении, это больше там, где вы решите разбить ее на части в первый раз. Драйвер — это конфигурация самого приложения. Поэтому сначала исправьте ошибку сборки (устраните пробел в сборке), а затем подумайте, какая конвейерная обработка больше подходит для преимуществ вашей CI/CD.
Например. если рабочему образу не нужен композитор (ИМХО, производственное приложение не должно зависеть от композитора), не отправляйте образ с двоичным файлом композитора. (Да, иногда это может помочь бросить несколько камней, чтобы понять, как мало масштабируется текущий рабочий процесс, честность - это всего лишь ответвление).
P.S.: Вы можете быстрее развертывать PHP-приложения, если не будете помещать их в контейнеры. Вы все еще можете запускать их в контейнерах. CI/CD позволяет вам иметь и то, и другое. Всегда помните о динамичности, PHP — это динамический язык, не боритесь с ним, просто позвольте ему работать.