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后缀文件,你可以按以下步骤配置:
- 在宿主机
./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
- 给脚本赋执行权限:
chmod +x ./mysql/system_config/init.sh - 修改Docker Compose配置,删除自定义的
command字段,新增volumes挂载项:
- ./mysql/system_config/init.sh:/docker-entrypoint-initdb.d/init.sh
方案2:脚本需要每次容器启动都执行
- 在宿主机
./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
- 给脚本赋执行权限:
chmod +x ./mysql/system_config/start.sh - 修改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
相关产品推荐
相关产品推荐

