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

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)

错误原因

  1. 容器网络主机名错误:在Metabase容器内部,localhost指向容器自身,而MySQL运行在独立的容器中,应使用Docker Compose自动生成的服务名mysql作为主机名。
  2. 数据库名不匹配:JDBC连接URI中指定的数据库是mysql,但实际预创建的数据库是metabase,两者不一致。
  3. 配置优先级冲突: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:

验证步骤

  1. 停止并清理现有容器:
    docker-compose down
    
  2. 重新部署服务:
    docker-compose up -d
    
  3. 查看Metabase日志确认连接状态:
    docker-compose logs -f metabase
    
    当日志显示数据库连接验证通过并完成初始化后,即可访问GitHub Codespace的3000端口进入Metabase配置界面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:48:09