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

使用Docker Compose连接Python与MySQL失败问题求助

问题排查与修复方案

导致连接失败的核心原因

  • SQL初始化脚本语法错误:init.sql中CREATE DATABASE IF NOT EXIST缺少s,正确语法为IF NOT EXISTS,这会导致MySQL容器初始化失败,服务无法正常对外提供连接。
  • 硬编码容器IP不可靠:直接使用固定IP172.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:55:25