Laravel应用CI/CD构建时composer install遇RedisCluster解析错误求助
Laravel Docker构建阶段Redis集群连接失败解决方案
问题场景
Laravel应用因缓存压力切换为Redis集群,本地运行正常,但在预发布/生产环境的Docker构建阶段,执行RUN composer install时失败,错误触发于package:discover脚本环节。
相关代码与日志
Dockerfile
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"); } }
核心原因
构建阶段的Docker容器无法解析Redis集群节点的域名,且通过修改构建服务器/etc/hosts的方式扩展性差,新增节点或切换构建服务器时需重复配置。
可行解决方案
方案1:禁用构建阶段的Composer脚本执行
构建阶段不需要触发Laravel的服务初始化脚本,先跳过脚本执行,待容器启动时再完成初始化:
- 修改Dockerfile中的
composer install命令:RUN composer install --no-scripts - 在容器启动脚本(如Supervisor配置或自定义entrypoint.sh)中添加后续初始化命令:
这样构建阶段不会尝试连接Redis集群,避免域名解析问题。composer dump-autoload --optimize php artisan package:discover
方案2:根据环境变量切换Redis连接逻辑
在RedisConnector中判断构建环境,返回模拟/本地Redis实例,避免连接集群:
- 修改
RedisConnector类:class RedisConnector { public static function create() { // 构建阶段使用本地单实例Redis或模拟对象 if (env('APP_ENV') === 'build') { $redis = new Redis(); // 构建阶段可启动临时本地Redis服务,或返回兼容的模拟类 $redis->connect('127.0.0.1', 6379); return $redis; } 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"); } } - 在Dockerfile中添加构建环境变量:
构建阶段会使用本地Redis,无需连接集群节点。ENV APP_ENV=build RUN composer install
方案3:改用Laravel原生Redis集群配置,避免硬编码节点
放弃自定义RedisConnector,使用Laravel自带的Redis配置,通过环境变量传递节点信息:
- 修改
config/database.php中的Redis配置:'redis' => [ 'client' => 'phpredis', 'clusters' => [ 'default' => [ 'nodes' => explode(',', env('REDIS_CLUSTER_NODES', '127.0.0.1:6379')), 'password' => env('REDIS_PASSWORD', 'bitnami'), 'timeout' => 1.5, 'read_timeout' => 1.5, 'persistent' => true, ], ], ], - 构建阶段设置
REDIS_CLUSTER_NODES为本地Redis,避免连接集群:
生产环境再通过环境变量注入真实的集群节点列表,无需修改代码。ENV REDIS_CLUSTER_NODES=127.0.0.1:6379 RUN composer install
内容的提问来源于stack exchange,提问作者Aria Shahdadi
相关产品推荐
相关产品推荐

