Docker-Compose部署Laravel项目:sudo运行Horizon遇Redis连接拒绝问题
问题:sudo执行php artisan horizon时Redis连接拒绝
环境与配置
docker-compose.yml 内容
version: '3.8' services: appetit-php: build: context: ./docker-file/php dockerfile: Dockerfile container_name: appetit-php restart: always volumes: - ./services/legacy:/var/www/ - ./docker-data/config/php/php.ini:/usr/local/etc/php/php.ini - ./docker-data/config/php/supervisor/conf.d/:/etc/supervisor/conf.d/ working_dir: /var/www networks: - appetit-network appetit-redis: image: "redis" container_name: appetit-redis restart: always volumes: - ./docker-data/data/redis/:/data/ ports: - "6378:6379" networks: - appetit-network networks: appetit-network: driver: bridge
问题现象
- 直接执行
php artisan horizon正常运行 - 执行
sudo php artisan horizon时触发Redis连接拒绝错误:
RedisException Connection refused at vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php:161
- 当前执行用户为
root(whoami输出root)
解决方案
1. 保留环境变量执行命令
sudo默认不会继承当前用户的环境变量,导致Laravel加载的Redis配置异常。执行命令时添加-E参数保留环境变量:
sudo -E php artisan horizon
2. 检查Redis连接配置
打开Laravel的config/database.php,确认Redis配置段的host和port:
- 如果是在php容器内部执行命令,
host必须是docker服务名appetit-redis,port为6379 - 如果是在宿主机执行命令,
host为localhost或127.0.0.1,port为映射的6378
同时确认.env文件中的REDIS_HOST和REDIS_PORT参数正确,且root用户能读取该文件(权限至少为644,可通过ls -l .env检查)。
3. 指定运行环境执行
如果多环境配置存在差异,执行时明确指定环境:
sudo php artisan horizon --env=production # 替换为你的实际环境名
4. 确认命令执行上下文
如果是在宿主机执行命令,确保没有混淆容器内部和外部的Redis端口;如果是在容器内部执行,直接使用docker服务名appetit-redis作为Redis主机地址即可。
内容的提问来源于stack exchange,提问作者Hanie Asemi
相关产品推荐
相关产品推荐

