PHP php_network_getaddresses在CICD composer安装步骤 &g



我有一个Laravel应用程序。由于后端缓存的压力,我们从单实例Redis切换到Redis集群。问题从这里开始,在我的设备上,一切都很好,但是,当我们推到登台或生产环境时,构建过程在docker构建上失败了,正是在RUN composer安装上。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

这是在CICD上的错误

#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 > IlluminateFoundationComposerScripts::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");
}
}

我尝试添加redisi -node-5, redisi -node-4,…到/etc/host在构建环境它工作,但我不认为这是一个很好的解决方案,当我们切换构建服务器或添加更多的节点重新配置他们需要时间。我知道它可以自动化,但我正在寻找一个更简单的解决方案

如果您认为伪造主机名条目不再足够(IMHO构建不应该需要运行),您可以通过在构建期间不运行编写器脚本(和插件)将主机配置从构建配置(应用程序修订)中分离出来。

RUN composer --no-interaction install --no-plugins --no-scripts

这有效地防止触发post-autoload-dump事件,从而导致

过早运行。
#12 19.30 > IlluminateFoundationComposerScripts::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期间的自动加载器。它还可以依赖于主机配置,因此可以作为部署的一部分,而不是构建的一部分,这是另一个很好的练习。

/编辑:

然后你可以考虑多阶段Docker构建(单独测试)如何帮助你管理不同阶段(修订构建/运行时环境特定配置)。这里没有硬性的规则,你总是在你的应用程序中有一个隐式的默认配置,更多的是你决定在第一次时将其分解。驱动程序是应用程序本身的配置。因此,首先修复构建错误(缩小构建差距),然后考虑哪种管道更适合您的CI/CD的好处。

。如果生产图像不需要composer(恕我直言,生产应用程序不应该依赖于composer),则不要将图像与composer二进制文件一起发布。(是的,有时它可以帮助扔一些石头来认识到当前工作流程的规模有多小,诚实只是一个分支)。

注::如果不将PHP应用程序关在容器中,可以更快地部署它们。你仍然可以在容器中运行它们。CI/CD可以让你两者兼得。永远记住动态,PHP是一种动态语言,不要对抗它,让它运行就好。

相关内容

  • 没有找到相关文章

最新更新