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

Docker Compose部署Streamlit+MariaDB连接失败问题求助

解决Streamlit应用Docker化后无法连接MariaDB的问题

错误原因分析

你遇到的OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)")错误,核心原因是Docker容器的网络隔离特性:在Streamlit应用容器里,localhost指向容器自身,而你的MariaDB运行在另一个独立的database容器中,因此无法通过localhost访问。

具体配置调整步骤

1. 修正数据库连接地址

  • 打开Streamlit应用代码或.env配置文件,将数据库连接的host参数从localhost改为database(对应docker-compose.yml中MariaDB服务的名称)。
  • 示例连接代码修改:
    conn = mysql.connector.connect(
        host="database",
        user=os.getenv("MYSQL_USER"),
        password=os.getenv("MYSQL_PASSWORD"),
        database=os.getenv("MYSQL_DATABASE")
    )
    
  • 若用.env管理配置,确保其中MYSQL_HOST变量值为database,而非localhost。

2. 优化Docker Compose网络配置(可选但更规范)

Docker Compose默认会为所有服务创建共享网络,服务间可通过名称互访。你可以显式声明网络,让配置更清晰:
在docker-compose.yml末尾添加以下内容:

networks:
  default:
    name: app-internal-network

所有服务会自动加入该自定义网络,名称解析更稳定。

3. 验证MariaDB环境变量配置

确保.env文件包含完整的MariaDB初始化变量,示例:

MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_DATABASE=your_target_db
MYSQL_USER=your_db_user
MYSQL_PASSWORD=your_user_password

这些变量会被MariaDB容器自动读取,完成数据库初始化。

4. 重启服务验证

执行以下命令重新构建并启动服务:

docker-compose down
docker-compose up --build -d

查看应用容器日志确认连接状态:

docker logs app

关键原理说明

Docker Compose会为每个服务分配容器内部IP,同时通过内置DNS将服务名称(如database)映射到对应容器的IP。同一Compose项目下的服务,必须使用服务名称作为主机名通信,而非localhost或宿主机IP。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:50:24