Docker环境下PHP无法等待Redis启动,healthcheck配置错误求助
问题修正及解决方案
现有问题汇总
- PHP代码中Redis连接参数错误:你通过
links将Redis服务的别名设置为redis,PHP容器内可直接通过主机名redis访问Redis服务,无需调用getenv('host')获取地址;端口6379是固定值而非环境变量名,调用getenv('6379')会返回空值,导致连接失败。 - 缺少Redis健康检查配置:默认的
depends_on仅保证Redis容器启动后再启动PHP容器,不会校验Redis服务是否已经就绪可以处理请求,Redis启动过程中PHP提前启动就会出现连接失败。 - Compose文件版本过低:你当前使用的
version: '2'不支持基于健康检查的启动依赖条件,需要升级到2.1及以上版本。
修正后的配置
1. index.php修正
<?php echo 'Starting'; $redis = new Redis(); // 直接使用links配置的主机名和默认端口 $redis->connect('redis', 6379); var_dump($redis->incr('foo')); ?>
2. docker-compose.yml修正
# 升级到2.4版本,兼容健康检查依赖配置 version: '2.4' services: php: build: context: docker/web dockerfile: Dockerfile-php-7.0 container_name: php ports: - "8280:80" links: - redis:redis # 配置启动依赖,等Redis健康检查通过后再启动PHP服务 depends_on: redis: condition: service_healthy redis: build: docker/cache container_name: redis # 新增Redis健康检查,用redis-cli ping验证服务是否就绪 healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 2s timeout: 2s retries: 10
你现有的两个Dockerfile无需修改,调整完上述两个文件后重新构建启动即可。
可选替代方案
如果不想用健康检查机制,也可以在PHP容器的启动逻辑中增加端口等待逻辑:
- 在PHP镜像构建时安装
netcat工具 - 将PHP的启动命令修改为循环检测Redis 6379端口通了之后,再执行PHP启动命令,也能达到相同效果。
内容的提问来源于stack exchange,提问作者lehan1819mailru
相关产品推荐
相关产品推荐

