通过pymysql从Flask容器访问Docker内MySQL数据库连接失败求助
问题根因及修复方案
1. 修正Docker Compose配置
你当前配置里存在MySQL初始化冲突:MYSQL_USER参数是用来创建额外普通用户的,你将其设为root会和MySQL默认的管理员root用户冲突,导致初始化失败、账号密码异常。同时缺少服务启动依赖配置,app可能在MySQL未完成初始化时就启动,导致连接失败。
修正后的配置如下:
version: "3.8" services: app: build: . ports: - 9090:5000 depends_on: db: condition: service_healthy # links属于旧特性,compose默认会为同项目服务创建内部DNS,直接用服务名db做hostname也可访问 links: - db:database db: platform: linux/x86_64 image: mysql:8.0 # 建议指定固定版本避免镜像更新导致兼容问题 command: --default-authentication-plugin=mysql_native_password restart: unless-stopped environment: MYSQL_DATABASE: main # 删掉冲突的MYSQL_USER、MYSQL_PASSWORD配置,直接用默认root账号即可 MYSQL_ROOT_PASSWORD: pass ports: - 3306:3306 healthcheck: test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-uroot", "-ppass"] interval: 5s timeout: 5s retries: 10
2. 修正Python数据库连接代码
你代码中存在冗余操作:with connection上下文会自动管理连接关闭,不需要手动调用connection.close();同时只有增删改操作需要执行commit(),查询操作不需要提交。
修正后的代码如下:
def database_controller(cmd): connection = db.connect(host="database", port=3306, user="root", password="pass", database="main") with connection: with connection.cursor() as cursor: cursor.execute(cmd) result = cursor.fetchall() # 如果是增删改操作,取消下面这行的注释 # connection.commit() return result
3. 额外启动时序兼容(可选)
首次启动时MySQL需要初始化数据库、创建账号,耗时较长。如果仍出现连接失败,可以在你的Python应用启动逻辑中加入重试:连接数据库失败时等待3-5秒后重试,最多重试5次即可覆盖初始化等待时长。
内容的提问来源于stack exchange,提问作者cheeseburgereddy
相关产品推荐
相关产品推荐

