如何启动MySQL数据库并连接本地API?Docker部署连接失败求助
Docker Compose部署下API无法连接MySQL 5.7的解决方案
问题背景
使用Docker Compose部署MySQL 5.7与Python Flask API时,API尝试连接数据库服务database:3306失败,报错:
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'database:3306' (111 Connection refused)
核心原因
depends_on仅控制容器的启动顺序,不会等待MySQL完成初始化并就绪接受连接。API启动时,MySQL可能仍在执行初始化逻辑(如运行init.sql、创建数据库对象等),此时无法建立有效连接。
解决方案1:使用Docker健康检查(推荐)
修改docker-compose.yml,为数据库服务添加健康检查规则,让API在数据库完全就绪后再启动:
version: '3.0' services: database: build: context: ./ dockerfile: ./project/docker/DockerfileDB image: tp5_ima_db_ltn_ad environment: MYSQL_ROOT_PASSWORD: "root" ports: - 3306:3306 healthcheck: # 用mysqladmin ping检查数据库是否就绪 test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] interval: 5s # 每5秒检查一次 timeout: 5s # 超时时间5秒 retries: 5 # 最多重试5次 api: build: context: ./ dockerfile: ./project/docker/DockerfileAPI image: tp5_ima_api_ltn_ad environment: INFRA_TP5_DB_TYPE: "MYSQL" INFRA_TP5_DB_HOST: "database" INFRA_TP5_DB_PORT: 3306 INFRA_TP5_DB_USER: "root" INFRA_TP5_DB_PASSWORD: "root" volumes: - .:/mnt/app ports: - 15555:5555 depends_on: database: condition: service_healthy # 等待数据库服务处于健康状态
解决方案2:在API启动脚本中添加等待逻辑
修改API的启动脚本run.sh,在启动API前先等待MySQL可用:
#!/bin/bash # 循环等待MySQL就绪 until mysql -h database -u root -proot -e "SELECT 1"; do echo "等待MySQL数据库启动..." sleep 2 done # 启动API服务 exec python3 "$@"
执行以下命令确保脚本有执行权限:
chmod +x run.sh
额外排查步骤
- 检查MySQL初始化日志:查看容器日志确认
init.sql是否执行正常,是否有语法错误导致数据库启动失败:
docker-compose logs database
- 确认MySQL监听地址:进入MySQL容器,执行
netstat -tulpn,确保mysqld监听0.0.0.0:3306(默认配置为该地址,若不是则需修改MySQL配置文件绑定0.0.0.0)。
内容的提问来源于stack exchange,提问作者LADsy8
相关产品推荐
相关产品推荐

