Docker部署Metabase连接MySQL时出现主机连接失败问题求助
解决Metabase连接MySQL容器失败的问题
问题场景
在GitHub Codespace实例中部署MySQL+Metabase服务栈,使用以下docker-compose.yml配置:
version: '3.7' services: mysql: image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: metabase MYSQL_USER: metabase_user MYSQL_PASSWORD: metabase_password volumes: - mysql_data:/var/lib/mysql metabase: image: metabase/metabase:latest restart: always ports: - "3000:3000" environment: MB_DB_TYPE: mysql MB_DB_DBNAME: metabase MB_DB_PORT: 3306 MB_DB_USER: metabase_user MB_DB_PASS: metabase_password MB_DB_HOST: mysql MB_DB_CONNECTION_URI: jdbc:mysql://localhost:3306/mysql?allowPublicKeyRetrieval=true&useSSL=false volumes: mysql_data:
部署后出现连接拒绝错误,核心日志片段如下:
Caused by: java.sql.SQLNonTransientConnectionException: 无法连接到地址=(host=localhost)(port=3306)(type=master) : 套接字无法连接到主机:localhost,端口:3306。连接被拒绝(Connection refused)
错误原因
- 容器网络主机名错误:在Metabase容器内部,
localhost指向容器自身,而MySQL运行在独立的容器中,应使用Docker Compose自动生成的服务名mysql作为主机名。 - 数据库名不匹配:JDBC连接URI中指定的数据库是
mysql,但实际预创建的数据库是metabase,两者不一致。 - 配置优先级冲突:Metabase会优先读取
MB_DB_CONNECTION_URI参数,导致你设置的MB_DB_HOST: mysql被忽略,最终使用URI中的localhost尝试连接。
修复方案
方案一:修正JDBC连接URI
修改Metabase的MB_DB_CONNECTION_URI参数,将主机名改为mysql,数据库名改为metabase:
metabase: image: metabase/metabase:latest restart: always ports: - "3000:3000" environment: MB_DB_TYPE: mysql MB_DB_DBNAME: metabase MB_DB_PORT: 3306 MB_DB_USER: metabase_user MB_DB_PASS: metabase_password MB_DB_HOST: mysql MB_DB_CONNECTION_URI: jdbc:mysql://mysql:3306/metabase?allowPublicKeyRetrieval=true&useSSL=false
方案二:移除JDBC连接URI(推荐)
由于已单独配置MB_DB_HOST、MB_DB_DBNAME等参数,这些参数足够Metabase建立连接,直接移除MB_DB_CONNECTION_URI可避免配置冲突:
version: '3.7' services: mysql: image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: metabase MYSQL_USER: metabase_user MYSQL_PASSWORD: metabase_password volumes: - mysql_data:/var/lib/mysql metabase: image: metabase/metabase:latest restart: always ports: - "3000:3000" environment: MB_DB_TYPE: mysql MB_DB_DBNAME: metabase MB_DB_PORT: 3306 MB_DB_USER: metabase_user MB_DB_PASS: metabase_password MB_DB_HOST: mysql volumes: mysql_data:
验证步骤
- 停止并清理现有容器:
docker-compose down - 重新部署服务:
docker-compose up -d - 查看Metabase日志确认连接状态:
当日志显示数据库连接验证通过并完成初始化后,即可访问GitHub Codespace的3000端口进入Metabase配置界面。docker-compose logs -f metabase
内容的提问来源于stack exchange,提问作者user1010101
相关产品推荐
相关产品推荐

