PHP php_network_getaddresses на этапе установки CI\CD composer

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы больше не считаете, что подделка записей имени хоста является адекватной (ИМХО, сборка не должна требовать этого для запуска), вы можете отделить конфигурацию хоста от конфигурации сборки (редакции приложения), не запуская скрипты композитора (и плагины) во время строить.

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 — это динамический язык, не боритесь с ним, просто позвольте ему работать.

Другие вопросы по теме