我有一个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是一种动态语言,不要对抗它,让它运行就好。