Docker Compose部署Todo应用无法连接MySQL容器求助
Docker Compose下Node应用无法连接MySQL的原因及解决办法
核心问题是服务启动顺序不匹配:Docker Compose默认会并行启动所有服务,你的Node应用启动后立即尝试连接MySQL,但此时MySQL还在完成初始化流程(包括创建临时服务器、初始化数据库、重启正式服务器),尚未就绪接受连接,导致应用连接超时。
从日志时间线可以明确看到:
- Node应用在17:31:32左右启动并开始等待MySQL,最终超时失败
- MySQL直到17:31:44才完成所有初始化,输出
ready for connections,此时才真正可以接受连接
而你用docker run单独启动时,应该是先启动MySQL,等它完全就绪后再启动Node应用,自然避开了这个时间差问题。
解决办法
方法1:给Docker Compose配置健康检查与依赖等待
修改你的docker-compose.yml,给MySQL服务添加健康检查,并让Node服务等待MySQL健康检查通过后再启动:
services: app: image: node:18-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos depends_on: mysql: condition: service_healthy mysql: image: mysql:8.0 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5 volumes: todo-mysql-data:
这个配置会让Compose等待MySQL的健康检查连续通过5次(每次间隔5秒)后,再启动Node服务,确保MySQL已经完全就绪。
方法2:优化Node应用的等待逻辑
修改Node应用的启动脚本,延长等待时间或者循环检查MySQL连接状态,直到连接成功再继续执行。比如可以用wait-for-it工具或者自己写简单的循环检查逻辑。
内容的提问来源于stack exchange,提问作者Miguel Ortega
相关产品推荐
相关产品推荐

