laravel PHP php_network_getaddresses on CI\CD composer安装步骤

ecfsfe2w  于 2023-04-13  发布在  PHP
关注(0)|答案(1)|浏览(208)

我有一个Laravel应用程序。由于后端缓存的压力,我们从单示例Redis切换到Redis集群。问题从这里开始,在我的设备上,一切正常,但是,当我们在staging或生产环境上推送时,构建过程在Docker build上失败,完全在RUN composer install上。RUN composer install
我们正在使用这个docker文件和另一个docker文件作为基本映像

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,它可以工作,但我不认为这是一个很好的解决方案,当我们切换构建服务器或添加更多的节点重新配置它们需要时间时。

3htmauhk

3htmauhk1#

如果您不认为伪造主机名条目已经足够了(恕我直言,构建应该不需要运行它),您可以通过在构建期间不运行composer脚本(和插件)来将主机配置与构建配置(应用程序修订版)分离。

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

这也是在CI构建期间运行composer install以创建应用程序修订版工件的推荐方法。
这不是什么灵丹妙药,因为你仍然需要在部署之前运行配置步骤。只是你的工件(这里是docker镜像)仍然是通用的,你可以选择稍后部署它的系统(本地,暂存,生产;一个、三个或五个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项目,然后你的.
然后在Dockerfile中的composer install期间考虑optimizing the autoloader。它也可以依赖于主机配置,因此可以是部署的一部分,而不是构建的一部分,这是另一个很好的练习。
/编辑:
然后你可以考虑如何multi-stage Docker builds(单独测试)可以帮助您管理不同的阶段(修订版本/构建/运行时环境特定的配置)。这里没有硬性规则,您始终在应用程序中具有隐式默认配置,它更多的是你第一次决定把它拆开的地方。驱动程序是应用程序本身的配置。因此,首先修复构建错误(缩小构建差距),然后考虑哪种流水线更适合CI/CD的优点。
例如,如果生产映像不需要composer(恕我直言,生产应用程序不应该依赖于composer),就不要将映像与composer二进制文件一起发布。(是的,有时候,扔一些石头来意识到当前工作流的规模是多么小是有帮助的,诚实只是一个分支)。
P.S.:如果你不把PHP应用程序关在容器里,你可以更快地部署它们。你仍然可以在容器里运行它们。CI/CD允许你两者兼得。永远记住保持动态,PHP是一种动态语言,不要与之斗争,让它运行。

相关问题