使用Docker Compose连接Python与MySQL失败问题求助
问题排查与修复方案
导致连接失败的核心原因
- SQL初始化脚本语法错误:
init.sql中CREATE DATABASE IF NOT EXIST缺少s,正确语法为IF NOT EXISTS,这会导致MySQL容器初始化失败,服务无法正常对外提供连接。 - 硬编码容器IP不可靠:直接使用固定IP
172.22.0.2不符合Docker Compose服务发现机制,一旦网络配置变动就会失效,且可能因容器启动顺序或网络问题导致解析异常。 - 依赖等待机制不精准:
depends_on仅保证容器启动,不确保MySQL服务就绪;sleep 10s是不可靠的临时方案,无法适配不同环境下的服务启动速度。
分步修复
1. 修正init.sql语法错误
将初始化脚本中的错误语句修正:
CREATE DATABASE IF NOT EXISTS db; USE db;
2. 修改Python脚本的连接地址
使用Docker Compose服务名db作为连接主机(自定义网络内会自动解析到数据库容器),替代硬编码IP:
import mysql.connector cnx = mysql.connector.connect(host='db', user='user', password='pass', database='db', port=3306)
3. 优化Docker Compose配置
添加MySQL健康检查,确保脚本容器仅在数据库服务就绪后启动;同时移除过时的links和不必要的固定IP配置:
version: "3" services: db: image: mysql container_name: db command: '--init-file /data/app/init.sql' ports: - "3306:3306" volumes: - "./init.sql:/data/app/init.sql" environment: MYSQL_DATABASE: "db" MYSQL_USER: "user" MYSQL_PASSWORD: "pass" MYSQL_ROOT_PASSWORD: "pass" networks: - net healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5 script: build: context: ./ dockerfile: Dockerfile depends_on: db: condition: service_healthy container_name: script command: python script.py networks: - net networks: net: driver: bridge
4. 验证修复
执行以下命令重新部署服务:
docker-compose down docker-compose up --build
完成以上修改后,MySQL容器会先完成初始化并通过健康检查,脚本容器才会启动并连接数据库,连接问题即可解决。
内容的提问来源于stack exchange,提问作者Motoko
相关产品推荐
相关产品推荐

