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
相关产品推荐
相关产品推荐

