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

Docker Compose配置command运行Python脚本连接MySQL报连接拒绝错误

问题根因

你在Docker Compose中自定义的command字段,直接覆盖了mysql:5.7镜像默认的启动逻辑:容器启动后只会执行你指定的Python脚本,不会启动MySQL服务,自然会出现3306端口连接被拒绝的报错。你手动exec执行脚本时,容器已经正常启动了MySQL服务,所以脚本可以正常运行。
你之前测试端口监听时看不到3306端口,也是同样的原因——替换启动命令后MySQL服务根本没有启动。

解决方案

根据你的脚本执行需求,选择对应方案即可:

方案1:脚本仅需首次数据库初始化时执行一次

mysql官方镜像默认会在首次启动(数据库数据目录/var/lib/mysql为空)时,执行/docker-entrypoint-initdb.d/目录下的所有.sh、.sql后缀文件,你可以按以下步骤配置:

  1. 在宿主机./mysql/system_config目录下新建初始化shell脚本init.sh,内容如下:
#!/bin/bash
# 等待MySQL服务就绪
until mysqladmin ping -uroot -p${MYSQL_ROOT_PASSWORD} --silent; do
    sleep 1
done
# 执行Python脚本
python3 /system_config/initialfunc.py
  1. 给脚本赋执行权限:chmod +x ./mysql/system_config/init.sh
  2. 修改Docker Compose配置,删除自定义的command字段,新增volumes挂载项:
- ./mysql/system_config/init.sh:/docker-entrypoint-initdb.d/init.sh

方案2:脚本需要每次容器启动都执行

  1. 在宿主机./mysql/system_config目录下新建自定义启动脚本start.sh,内容如下:
#!/bin/bash
# 后台启动原生MySQL入口进程
docker-entrypoint.sh mysqld &
# 最多等待30秒直到MySQL服务就绪
timeout 30 bash -c "until mysqladmin ping -uroot -p${MYSQL_ROOT_PASSWORD} --silent; do sleep 1; done"
# 执行目标Python脚本
python3 /system_config/initialfunc.py
# 前台挂起MySQL进程,防止容器退出
wait
  1. 给脚本赋执行权限:chmod +x ./mysql/system_config/start.sh
  2. 修改Docker Compose的command字段为:
command: /system_config/start.sh

额外注意

你当前Python脚本中MySQL密码写死为asdf,建议改为读取环境变量和Compose配置统一,避免后续修改密码后脚本失效:

con_Mysql = sql.connect(host="localhost", user="root", password=os.getenv("MYSQL_ROOT_PASSWORD"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:15:04