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

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有时日志显示“准备好连接”,但实际还没完成初始化(比如数据库创建、权限配置)。别只检测端口,改成验证登录:
    wait-for-it.sh db:3306 --timeout=120 --strict -- mysql -h db -u events -p你的密码 -e "SELECT 1;"
    
    这样能确保MySQL真的能处理请求后,再启动web服务。
  • 修复Docker DNS解析:Ubuntu 22.04偶尔会出现Docker DNS异常,先试试重启Docker:
    sudo systemctl restart docker
    
    不行的话,就在docker-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:
        - db
    
    注意depends_on只保证启动顺序,不保证服务就绪,但正确配置能避免web服务过早启动。
  • 调整wait-for-it参数:检查脚本里的主机名、端口有没有拼写错误,同时把超时时间拉长点,比如从60秒改成120秒,给MySQL足够的初始化时间。

内容的提问来源于stack exchange,提问作者Susitha Ravinda Senarath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:05:14