如何在Docker容器中自动运行Laravel队列Worker并解决Redis连接问题
Laravel队列服务Redis连接失败问题解决
问题场景
通过Docker Compose配置了app(PHP-FPM)和queue(队列Worker)两个服务,二者使用相同镜像与挂载卷,期望启动Compose后自动运行php artisan queue:work。但queue服务无法接收任务,手动进入容器执行命令时,日志中出现Redis连接失败错误:
[2024-09-04 19:40:48] local.ERROR: php_network_getaddresses: getaddrinfo for redis failed: Name or service not known {"exception":"[object] (RedisException(code: 0): php_network_getaddresses: getaddrinfo for redis failed: Name or service not known at /var/www/html/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php:159)
.env文件中Redis配置为REDIS_HOST=redis,但在app容器中执行queue:work却能正常运行。
问题根源
queue服务未加入与app、Redis相同的laravel自定义网络。Docker容器默认仅加入默认网络,只有同属一个自定义网络的容器才能通过服务名(如redis)互相解析访问。
解决方案
1. 给queue服务添加网络配置
修改Docker Compose中queue服务的配置,加入laravel网络:
queue: build: context: php volumes: - ./laravel:/var/www/html command: ['/bin/sh', '-c', 'php artisan queue:work'] depends_on: - redis - app networks: - laravel # 加入与app、Redis同个自定义网络
2. 确保Redis服务也在laravel网络中
检查Redis服务的配置,确认已加入laravel网络,示例配置:
redis: image: redis:alpine networks: - laravel
3. (可选)优化镜像复用
避免重复构建镜像,可在app服务中定义镜像名,queue服务直接复用:
services: app: build: context: php image: laravel-php:latest # 定义镜像标识 container_name: laravel_app volumes: - ./laravel:/var/www/html networks: - laravel queue: image: laravel-php:latest # 复用已构建的镜像 volumes: - ./laravel:/var/www/html command: ['/bin/sh', '-c', 'php artisan queue:work'] depends_on: - redis - app networks: - laravel
4. (可选)添加Redis健康检查
确保Redis服务完全就绪后再启动queue服务,避免因Redis未启动完成导致的连接失败:
redis: image: redis:alpine networks: - laravel healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 3 queue: # ... 其他配置 depends_on: redis: condition: service_healthy # 等待Redis健康检查通过 app: condition: service_started
内容的提问来源于stack exchange,提问作者rayankb92
相关产品推荐
相关产品推荐

