Docker Compose依赖服务db:3306无法访问,wait-for-it超时排查
问题描述
运行HubSpot的webhooks示例应用时,用Docker Compose部署,webhooks_web服务依赖db(MySQL 8.0)服务。配置了wait-for-it脚本等待db启动,但脚本超时报错:
wait-for-it.sh: timeout occurred after waiting 60 seconds for db:3306
排查发现webhooks_web容器的/etc/hosts里没有db对应的DNS记录,不过db服务日志显示已经准备好接受连接,而且能通过docker-compose exec进入db容器,用mysql -u events -p正常登录MySQL。环境是Ubuntu 22.04,Docker版本23.0.1,build a5ee5b1。
排查与解决方法
- 检查网络归属:Docker Compose默认会给所有服务创建并加入同一个默认网络,服务名可以直接当主机名解析。如果
webhooks_web和db不在同一个网络里,就会出现解析失败。打开docker-compose.yml确认两个服务没有指定不同的自定义网络,确保它们在同一网络环境下。 - 强化wait-for-it的就绪检测:MySQL 8.0有时日志显示“准备好连接”,但实际还没完成初始化(比如数据库创建、权限配置)。别只检测端口,改成验证登录:
这样能确保MySQL真的能处理请求后,再启动web服务。wait-for-it.sh db:3306 --timeout=120 --strict -- mysql -h db -u events -p你的密码 -e "SELECT 1;" - 修复Docker DNS解析:Ubuntu 22.04偶尔会出现Docker DNS异常,先试试重启Docker:
不行的话,就在sudo systemctl restart dockerdocker-compose.yml里给webhooks_web加个DNS配置:webhooks_web: # 其他原有配置 dns: - 8.8.8.8 - 1.1.1.1 - 确认服务依赖配置:确保
webhooks_web在docker-compose.yml里明确依赖db,没有的话加上:
注意webhooks_web: depends_on: - dbdepends_on只保证启动顺序,不保证服务就绪,但正确配置能避免web服务过早启动。 - 调整wait-for-it参数:检查脚本里的主机名、端口有没有拼写错误,同时把超时时间拉长点,比如从60秒改成120秒,给MySQL足够的初始化时间。
内容的提问来源于stack exchange,提问作者Susitha Ravinda Senarath
相关产品推荐
相关产品推荐

