如何通过SQLAlchemy与Docker Compose实现MySQL连接?
解决Docker Compose部署MySQL与SQLAlchemy连接问题
问题分析
你的配置存在几个关键错误,导致连接失败:
- MySQL容器端口映射错误,容器内默认端口是3306,但你映射了主机3307到容器3307,容器内MySQL并未修改端口,导致端口不匹配
- 环境变量配置冲突,root用户密码应该用
MYSQL_ROOT_PASSWORD而非MYSQL_PASSWORD,同时MYSQL_ALLOW_EMPTY_PASSWORD和密码设置冲突 - 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作为主机,端口用容器内的3306engine = create_engine("mysql+mysqlconnector://root:Roh1t#mishra@db:3306/finops", echo=True) - 如果代码在本地主机运行:使用
127.0.0.1作为主机,端口用主机映射的3307engine = 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
相关产品推荐
相关产品推荐

