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

Docker环境下Apache Superset无法连接MSSQL Server求助

Docker部署Apache Superset连接MSSQL Server失败问题排查与解决

问题描述

我通过Docker容器部署了Apache Superset与Microsoft SQL Server,使用Azure Data Studio可成功连接MSSQL Server,但尝试从Apache Superset建立连接时遭遇错误,错误信息如下:

ERROR: (builtins.NoneType) None
[SQL: (pymssql._pymssql.OperationalError) (20009, b'DB-Lib error message 20009, severity 9:\nUnable to connect: Adaptive Server is unavailable or does not exist (@@172.17.0.2)\n')
(Background on this error at: https://sqlalche.me/e/14/e3q8)]
(Background on this error at: https://sqlalche.me/e/14/dbapi)

已完成的排查步骤:

  • 验证网络可达性:确认无防火墙或网络限制阻断连接,容器均正常运行
  • 检查MSSQL Server状态:容器运行正常,IP地址与连接配置一致
  • 跨环境连接测试:Azure Data Studio可成功连接MSSQL,问题仅存在于Superset与MSSQL之间
  • 核对连接信息:用户名、密码、主机IP、数据库名称均与MSSQL设置一致
  • 尝试不同连接字符串:测试pymssql、pyodbc库,添加加密、信任服务器证书等参数
  • 检查Docker网络配置:Superset与MSSQL容器处于同一网络,网络内可互通
  • 网络连通性测试:ping、telnet 1433端口均能正常访问MSSQL

尽管完成上述排查,仍无法建立连接,错误依旧。

可能成因

  1. Superset容器缺少MSSQL驱动依赖:官方Superset镜像默认未安装完整的MSSQL连接驱动(比如pyodbc需要的unixODBC及msodbcsql17驱动),即使指定pyodbc连接字符串,也会因依赖缺失导致连接失败。
  2. pymssql版本兼容性问题:pymssql对新版MSSQL Server的加密协议支持不完善,尤其是当MSSQL强制要求加密连接时,pymssql无法正确处理证书验证。
  3. Docker网络DNS解析问题:虽然使用IP连接,但部分场景下容器内DNS缓存或网络配置导致IP解析异常,或者MSSQL容器的主机名映射未正确配置。
  4. MSSQL Server的TCP/IP配置限制:MSSQL容器内可能未启用TCP/IP协议,或者监听的IP不是容器内的内网IP,导致Superset无法通过指定IP连接。

解决方法

方法1:安装完整的MSSQL驱动到Superset容器

如果使用pyodbc连接,需要确保Superset容器内安装了unixODBC和msodbcsql17驱动:

  1. 进入运行中的Superset容器:
docker exec -it <superset_container_name> /bin/bash
  1. 在容器内执行以下命令安装依赖(基于Debian/Ubuntu镜像):
# 安装依赖包
apt-get update && apt-get install -y unixodbc-dev curl
# 添加微软源
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list
# 安装msodbcsql17
apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql17
  1. 重启Superset容器:
docker restart <superset_container_name>
  1. 使用pyodbc连接字符串,格式如下:
mssql+pyodbc://<username>:<password>@<mssql_container_ip>:1433/<database_name>?driver=ODBC+Driver+17+for+SQL+Server&TrustServerCertificate=yes&Encrypt=yes

方法2:替换pymssql为pyodbc并调整连接参数

放弃使用pymssql,直接采用pyodbc连接,确保连接字符串包含必要的加密参数:

  • 连接字符串模板:
mssql+pyodbc://SA:YourStrongPassword@mssql-container-name:1433/YourDatabase?driver=ODBC+Driver+17+for+SQL+Server&TrustServerCertificate=True&Encrypt=YES

注意:使用MSSQL容器的名称替代IP,利用Docker DNS解析避免IP变动问题

方法3:检查MSSQL容器的TCP/IP配置

  1. 进入MSSQL容器:
docker exec -it <mssql_container_name> /bin/bash
  1. 运行sqlcmd启用TCP/IP协议(如果未启用):
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P <your_password>
# 执行以下SQL语句:
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'remote access', 1;
RECONFIGURE;
GO
  1. 重启MSSQL容器:
docker restart <mssql_container_name>

方法4:自定义Superset镜像预安装驱动

如果需要长期解决依赖问题,可自定义Superset镜像,在Dockerfile中添加驱动安装步骤:

FROM apache/superset:latest

USER root

# 安装MSSQL驱动依赖
RUN apt-get update && apt-get install -y unixodbc-dev curl \
    && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql17

USER superset

然后重新构建镜像并启动容器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:02:49