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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:09:05