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

如何通过SQLAlchemy与Docker Compose实现MySQL连接?

解决Docker Compose部署MySQL与SQLAlchemy连接问题

问题分析

你的配置存在几个关键错误,导致连接失败:

  1. MySQL容器端口映射错误,容器内默认端口是3306,但你映射了主机3307到容器3307,容器内MySQL并未修改端口,导致端口不匹配
  2. 环境变量配置冲突,root用户密码应该用MYSQL_ROOT_PASSWORD而非MYSQL_PASSWORD,同时MYSQL_ALLOW_EMPTY_PASSWORD和密码设置冲突
  3. SQLAlchemy连接字符串的主机和端口错误:如果是容器内的api服务连接,应该用Docker Compose服务名db而非127.0.0.1;如果是本地连接,端口应该用主机映射的3307而非3306

修正步骤

1. 修正docker-compose.yml配置

version: "3.9"
services:
  db:
    image: mysql:8
    environment:
      MYSQL_DATABASE: finops
      MYSQL_ROOT_PASSWORD: Roh1t#mishra  # root用户密码用这个变量
      # 若需要创建普通用户,保留以下两行,否则可删除
      # MYSQL_USER: your_user
      # MYSQL_PASSWORD: your_user_password
    ports:
      - 3307:3306  # 主机3307映射到容器默认3306端口
    volumes:
      - mysql_data:/var/lib/mysql  # 持久化数据,避免容器重启丢失
    expose:
      - 3306  # 暴露容器内默认端口

  api:
    build: ./cost-controller-engine
    ports:
      - 8023:8023
    environment:
      WAIT_HOSTS: db:3306  # 等待db的3306端口就绪
    depends_on:
      - db
    expose:
      - 8023

volumes:
  mysql_data:  # 定义数据卷

2. 修正SQLAlchemy连接字符串

  • 如果代码在api容器内部运行:使用Docker Compose服务名db作为主机,端口用容器内的3306
    engine = create_engine("mysql+mysqlconnector://root:Roh1t#mishra@db:3306/finops", echo=True)
    
  • 如果代码在本地主机运行:使用127.0.0.1作为主机,端口用主机映射的3307
    engine = create_engine("mysql+mysqlconnector://root:Roh1t#mishra@127.0.0.1:3307/finops", echo=True)
    

3. 额外注意事项

  • 确保mysql容器完全启动后再启动api服务,虽然WAIT_HOSTS会等待端口开放,但建议使用更可靠的等待脚本(比如wait-for-it)确保mysql服务就绪
  • 若遇到密码特殊字符(比如#)导致连接失败,可尝试对密码进行URL编码,#编码后是%23,连接字符串变为:
    # 容器内连接示例
    engine = create_engine("mysql+mysqlconnector://root:Roh1t%23mishra@db:3306/finops", echo=True)
    

内容的提问来源于stack exchange,提问作者Rohit Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:30:50