You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的服务初始化脚本,先跳过脚本执行,待容器启动时再完成初始化:

  1. 修改Dockerfile中的composer install命令:
    RUN composer install --no-scripts
    
  2. 在容器启动脚本(如Supervisor配置或自定义entrypoint.sh)中添加后续初始化命令:
    composer dump-autoload --optimize
    php artisan package:discover
    
    这样构建阶段不会尝试连接Redis集群,避免域名解析问题。

方案2:根据环境变量切换Redis连接逻辑

在RedisConnector中判断构建环境,返回模拟/本地Redis实例,避免连接集群:

  1. 修改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");
        }
    }
    
  2. 在Dockerfile中添加构建环境变量:
    ENV APP_ENV=build
    RUN composer install
    
    构建阶段会使用本地Redis,无需连接集群节点。

方案3:改用Laravel原生Redis集群配置,避免硬编码节点

放弃自定义RedisConnector,使用Laravel自带的Redis配置,通过环境变量传递节点信息:

  1. 修改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,
            ],
        ],
    ],
    
  2. 构建阶段设置REDIS_CLUSTER_NODES为本地Redis,避免连接集群:
    ENV REDIS_CLUSTER_NODES=127.0.0.1:6379
    RUN composer install
    
    生产环境再通过环境变量注入真实的集群节点列表,无需修改代码。

内容的提问来源于stack exchange,提问作者Aria Shahdadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:17:56