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
尽管完成上述排查,仍无法建立连接,错误依旧。
可能成因
- Superset容器缺少MSSQL驱动依赖:官方Superset镜像默认未安装完整的MSSQL连接驱动(比如pyodbc需要的unixODBC及msodbcsql17驱动),即使指定pyodbc连接字符串,也会因依赖缺失导致连接失败。
- pymssql版本兼容性问题:pymssql对新版MSSQL Server的加密协议支持不完善,尤其是当MSSQL强制要求加密连接时,pymssql无法正确处理证书验证。
- Docker网络DNS解析问题:虽然使用IP连接,但部分场景下容器内DNS缓存或网络配置导致IP解析异常,或者MSSQL容器的主机名映射未正确配置。
- MSSQL Server的TCP/IP配置限制:MSSQL容器内可能未启用TCP/IP协议,或者监听的IP不是容器内的内网IP,导致Superset无法通过指定IP连接。
解决方法
方法1:安装完整的MSSQL驱动到Superset容器
如果使用pyodbc连接,需要确保Superset容器内安装了unixODBC和msodbcsql17驱动:
- 进入运行中的Superset容器:
docker exec -it <superset_container_name> /bin/bash
- 在容器内执行以下命令安装依赖(基于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
- 重启Superset容器:
docker restart <superset_container_name>
- 使用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配置
- 进入MSSQL容器:
docker exec -it <mssql_container_name> /bin/bash
- 运行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
- 重启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
相关产品推荐
相关产品推荐

