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

Docker Compose环境下Python连接MariaDB报2003错误如何解决?

问题根因及修复方案

1. 核心问题:app服务未加入专属网络

你在docker-compose中自定义了myprestashop网桥,mariadb、phpMyAdmin、prestashop服务均加入了该网络,但app服务没有指定网络配置,默认会接入compose自动生成的默认网桥,和mariadb不在同一个网络平面,无法解析mariadb服务名、也无法建立连接,这是报错的核心原因。

修复方法:

在app服务的配置中补充网络声明,加入myprestashop网络:

app:
  build:
    context: .
    dockerfile: ./Dockerfile
  volumes:
    - ./app:/app
  command: >
    sh -c "python3 services/db_connection.py"
  depends_on:
    - mariadb
  # 新增以下配置,加入自定义网络
  networks:
    myprestashop:

2. 次生问题:数据库启动时序差

depends_on仅控制容器启动顺序,不会等待mariadb内部进程完全初始化、端口开放后再启动app服务,若app启动速度远快于mariadb初始化速度,也会触发连接失败报错。

修复方法二选一:

  • 方法1:在Python连接代码中增加重试逻辑,示例如下:
import mysql.connector as database
import time

retry_count = 5
retry_interval = 3
connection = None

for i in range(retry_count):
    try:
        connection = database.connect(
            user='root',
            password='mycustompassword',
            host='mariadb',
            database='prestashop')
        break
    except database.errors.InterfaceError as e:
        if i == retry_count -1:
            raise e
        print(f"连接失败,{retry_interval}秒后重试,剩余重试次数:{retry_count - i -1}")
        time.sleep(retry_interval)

if connection:
    print ("Connected Successfully")
else:
    print ("Connection Not Established")
  • 方法2:在容器启动命令中增加端口检测逻辑,等待mariadb的3306端口开放后再执行Python代码:
command: >
  sh -c "while ! nc -z mariadb 3306; do sleep 1; done; python3 services/db_connection.py"

使用该方法需要保证你的app镜像中预装了netcat工具,可在Dockerfile中增加对应安装命令。

验证方法

修改配置后重新启动服务,进入app容器执行ping mariadb,能正常解析IP则说明网络配置生效。

内容的提问来源于stack exchange,提问作者thepylot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:45:11