Docker Compose环境下Streamlit应用无法连接MariaDB问题
解决Streamlit应用无法连接Docker中MariaDB的问题
核心问题分析
报错显示连接localhost失败,但你配置的host是mariadb,说明存在网络隔离、环境变量未正确加载或连接参数缺失的问题,以下是针对性解决思路:
1. 让Streamlit应用容器与MariaDB处于同一网络
你的app服务未加入streamlit_network网络,导致两个容器不在同一网络域内,无法通过服务名mariadb访问。修改docker-compose.yml的app服务配置:
services: app: restart: always build: ./app ports: - "8501:8501" command: streamlit run Main.py networks: # 新增网络配置 - streamlit_network
2. 修复环境变量的格式与加载配置
- 修正.env文件格式:变量值不要加引号,否则读取到的内容会包含引号,导致解析错误:
# Environment variables defined inside a .env file host=mariadb user=testing password=passtest database=testtest port=3306 # 容器内MariaDB默认端口为3306,与宿主机映射端口无关 - 在docker-compose中加载.env:给
app服务添加env_file配置,确保环境变量传入容器(路径根据实际存放位置调整):app: restart: always build: ./app ports: - "8501:8501" command: streamlit run Main.py env_file: ./app/.env # 加载.env文件 networks: - streamlit_network
3. 完善数据库连接代码
你的连接代码未传入port参数,需补充对应配置:
conn = pymysql.connect( host=os.environ.get("host"), user=os.environ.get("user"), password=os.environ.get("password"), database=os.environ.get("database"), port=int(os.environ.get("port")), # 新增端口参数 cursorclass=pymysql.cursors.DictCursor )
4. 修正MariaDB的端口映射配置
MariaDB默认监听容器内的3306端口,你当前的端口映射xxx.xx.xx.xx:3307:3307错误,应改为宿主机端口映射到容器内的3306:
mariadb: image: mariadb:10.5.17 ports: - "xxx.xx.xx.xx:3307:3306" # 修正容器内端口为3306 volumes: - db_data:/var/lib/mysql - db_conf:/etc/mysql/conf.d environment: MARIADB_ROOT_PASSWORD: test MARIADB_DATABASE: testtest MARIADB_USER: testing MARIADB_PASSWORD: passtest networks: - streamlit_network
5. 验证网络连通性(可选)
如果仍有问题,可进入app容器内测试与mariadb的连通性:
# 进入app容器 docker exec -it <app容器名称> bash # 安装ping工具(容器未预装时) apt update && apt install iputils-ping # 测试服务名解析 ping mariadb
内容的提问来源于stack exchange,提问作者divyashie
相关产品推荐
相关产品推荐

