Docker部署Flask费用追踪应用时MySQL连接失败及变量未定义问题
Flask+Docker费用追踪应用报错处理方案
1. 解决Flask无法连接MySQL(Connection refused)
问题根源是Flask服务启动早于MySQL初始化完成,或者网络/连接参数配置错误,解决方案如下:
- 在
docker-compose.yml中为db服务添加健康检查,确保MySQL就绪后再启动app服务 - 确认Flask的数据库连接参数中,
host为docker-compose中定义的db服务名,端口、用户名密码与db服务配置一致
示例docker-compose.yml关键配置:
services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: expense123 # 同时解决空密码警告 MYSQL_DATABASE: expense_tracker volumes: - ./create_tables.sql:/docker-entrypoint-initdb.d/create_tables.sql # 自动执行建表脚本 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pexpense123"] interval: 5s timeout: 5s retries: 5 app: build: . depends_on: db: condition: service_healthy ports: - "5000:5000" environment: DB_HOST: db DB_USER: root DB_PASSWORD: expense123 DB_NAME: expense_tracker
2. 解决MySQL root空密码警告
直接在docker-compose.yml的db服务环境变量中设置MYSQL_ROOT_PASSWORD(如上面示例中的expense123),MySQL初始化时会自动设置密码,警告即可消除。
3. 解决NameError: name 'mysql' is not defined与建表脚本未执行
建表脚本未执行
- 确保
create_tables.sql挂载到db服务的/docker-entrypoint-initdb.d/目录下(如上面的volumes配置),MySQL首次启动时会自动执行该目录下的SQL文件 - 若之前已创建过容器,需先清理旧数据卷:
docker-compose down -v,再重新构建启动
NameError: mysql未定义
这是Flask应用未正确初始化MySQL连接对象导致的,以flask-mysqldb为例,示例app.py配置:
from flask import Flask from flask_mysqldb import MySQL import os app = Flask(__name__) # 从环境变量读取数据库配置 app.config['MYSQL_HOST'] = os.environ.get('DB_HOST') app.config['MYSQL_USER'] = os.environ.get('DB_USER') app.config['MYSQL_PASSWORD'] = os.environ.get('DB_PASSWORD') app.config['MYSQL_DB'] = os.environ.get('DB_NAME') # 初始化mysql对象 mysql = MySQL(app) # 注册示例视图 @app.route('/register', methods=['POST']) def register(): # 使用mysql对象操作数据库 cur = mysql.connection.cursor() cur.execute("INSERT INTO users (username, password) VALUES (%s, %s)", ("test", "hashed_pass")) mysql.connection.commit() cur.close() return "注册成功"
同时确保requirements.txt包含依赖:
Flask==2.3.3 flask-mysqldb==1.0.1
最终执行步骤
- 更新上述配置文件
- 清理旧容器与数据卷:
docker-compose down -v - 重新构建启动:
docker-compose up --build
内容的提问来源于stack exchange,提问作者Yeury De los Santos
相关产品推荐
相关产品推荐

