我有一个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,它可以工作,但我不认为这是一个很好的解决方案,当我们切换构建服务器或添加更多的节点重新配置它们需要时间时。
1条答案
按热度按时间3htmauhk1#
如果您不认为伪造主机名条目已经足够了(恕我直言,构建应该不需要运行它),您可以通过在构建期间不运行composer脚本(和插件)来将主机配置与构建配置(应用程序修订版)分离。
这有效地防止触发 post-autoload-dump 事件,该事件导致
这也是在CI构建期间运行
composer install
以创建应用程序修订版工件的推荐方法。这不是什么灵丹妙药,因为你仍然需要在部署之前运行配置步骤。只是你的工件(这里是docker镜像)仍然是通用的,你可以选择稍后部署它的系统(本地,暂存,生产;一个、三个或五个Redis节点等)。
请参考您正在使用的Laravel版本和模块的部署和配置指南,并在部署阶段绑定相应的命令/让您的部署代理处理它们。Docker镜像尚未看到它们。
您已经可以通过执行显式自动加载转储来准备剥离,但要使用以下脚本:
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是一种动态语言,不要与之斗争,让它运行。