手动连接两个 Docker 容器:SQL Server 和 Jupyter Lab - 错误:(“IM004”)

Manually connecting two Docker containers: SQL Server and Jupyter Lab - Error: ('IM004')

提问人:ClearNote97 提问时间:11/4/2023 最后编辑:marc_sClearNote97 更新时间:11/4/2023 访问量:30

问:

我目前在一家医疗保健公司担任数据分析师,DataLake 基础结构位于 SQL Server 中,出于结构化写作原因,我目前正在尝试分析 Jupyter Lab Notebook 中所有数据库的当前状态。

从几个月前开始,我也一直在使用 Docker 容器,因为我发现它们是更好的工具,以便在出于安全原因在隔离环境中工作时获得良好的计算性能。这就是为什么我没有那么多使用 docker 的经验。

我想保持一种动手编程的方法。

我一直在尝试通过Docker Network创建连接,它似乎运行良好,但是当使用“pyodbc”、“SQLAlchemy”和“SQL Magic”连接到数据库时,它总是显示以下错误消息:

错误: ('IM004', “[IM004] [unixODBC][驱动程序管理器] SQL_HANDLE_HENV上的驱动程序的 SQLAllocHandle 失败 (0) (SQLDriverConnect)”)

我建立了以下手动连接过程:

Docker 配置阶段

  • 外壳被打开
  • 在容器之间创建桥梁:
    • SQL Server - Jupyter:

创建容器网络:

docker network create **networkname**

创建容器并将其连接到网络:

docker run --rm -t -d --name=**jupytercontainername** -p 8888:8888 --mount src="$(pwd)",target=/"Users",type=bind --network **networkname** **jupyterimagename**
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Developer" -e "MSSQL_SA_PASSWORD=**sqlpassword**" -e "MSSQL_TCP_PORT=1433" -p 1433:1433 -d --name **sqlcontainername** --network **networkname** sqlserver:2022-latest

请注意,这些命令与用于创建独立容器的命令相同,只是将它们连接到创建的网络。

部署容器并输入它:

docker exec -ti **jupytercontainername** bash

安装所需的 ODBC 驱动程序:

apt-get update
apt-get install unixodbc unixodbc-dev odbcinst

验证驱动程序的安装:

find / -name libodbc.so.2
find / -name odbcinst.ini

退出容器以重新启动它并应用更改:

exit
docker restart **jupytercontainername**
docker exec -ti **jupytercontainername** bash

调整 libodbc.so.2 的 PATH:

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu

编辑 SQL Server 的 ODBC 驱动程序的 odbcinst.ini:

apt-get install nano
nano /etc/odbcinst.ini

输入以下内容:

[ODBC Driver 17 for SQL Server]
Description = Microsoft ODBC Driver 17 for SQL Server
Driver      = /usr/lib/x86_64-linux-gnu/libodbc.so.2

保存并退出 nano:

    (Ctrl + O) Guardar
    (Ctrl + X) Salir

确认配置:odbcinst.ini

odbcinst -q -d -n "ODBC Driver 17 for SQL Server"

它应显示与使用 nano 文本编辑器输入的内容相同的内容,如上一步所述。

在系统中注册 odbcinst.ini:

odbcinst -i -d -f /etc/odbcinst.ini

退出容器以重新启动它并应用更改:

exit
docker restart **jupytercontainername**
docker exec -ti **jupytercontainername** bash

打开 Jupyter Lab:

jupyter lab --ip='0.0.0.0' --port=8888 --no-browser --allow-root

Jupyter 连接阶段

  • Jupyter 在浏览器中打开
  • 库已安装:
!pip install --upgrade pip
!pip install pyodbc  # Controlador ODBC para SQL Server
!pip install sqlalchemy # Librería ORM para conectarse a bases de datos desde Python
!pip install ipython-sql  # SQL Magic
!pip install pandas # Para el análisis de las BD's

导入库:

import pyodbc
import sqlalchemy
import pandas as pd

SQL Magic 扩展称为:

%load_ext sql

已创建 pyodbc 连接:

hostname = '**servername**'
port = 1433
database = '**databasename**'
username = '**usiernamename**'
password = '**passwordname**'

cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+hostname+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()

错误出现的位置如下:

错误
回溯(最近一次调用最后一次)
单元格 In[4],第 9 行
5 username = 'usiernamename'
6 password = 'passwordname'
----> 9 cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};服务器='+主机名+';UID='+用户名+';PWD='+ 密码) 10 光标 = cnxn.cursor()

错误: ('IM004', “[IM004] [unixODBC][驱动程序管理器] SQL_HANDLE_HENV上的驱动程序的 SQLAllocHandle 失败 (0) (SQLDriverConnect)”)

SQL Magic 连接已创建:

    hostname = '**servername**'
    port = 1433
    database = '**databasename**'
    username = '**usiernamename**'
    password = '**passwordname**'

    connection_string = f'mssql+pyodbc://{username}:{password}@{hostname}/{database}?driver=ODBC+Driver+17+for+SQL+Server'

    Charging the SQL Magic connection
    %sql $connection_string

出现相同的错误:

        sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('IM004', "[IM004] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed (0) (SQLDriverConnect)")
        (Background on this error at: https://sqlalche.me/e/20/dbapi)
    
        Connection info needed in SQLAlchemy format, example:
                       postgresql://username:password@hostname/dbname
                       or an existing connection: dict_keys([])

经过几天的调查,我得出的结论是,这似乎是ODBC配置问题或ODBC PATH配置问题,因为我在一般主机中尝试了pyodbc连接,并且运行良好。

如果有人能帮我解决这个问题,我会很高兴。

sql-server docker odbc jupyter-lab

评论

0赞 AlwaysLearning 11/4/2023
您究竟在哪里安装了 Microsoft 提供的适用于 SQL Server 的 ODBC 驱动程序 17?似乎您正在破解文件,而如果已正常安装 ODBC Driver 17 for SQL Server,则此行将类似于 ./etc/odbcinst.iniDriver=/usr/lib/x86_64-linux-gnu/libodbc.so.2Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.5.1
0赞 AlwaysLearning 11/4/2023
我建议确认 Jupyter 映像中使用了哪个 Linux 发行版和版本,然后按照特定于发行版的说明安装适用于 SQL Server 的 Microsoft ODBC 驱动程序 (Linux)cat /etc/os-release
0赞 ClearNote97 11/14/2023
所以,它看起来与以下方面有关: 由于我没有将数据库凭据放在 SQL docker 运行链上,因此,我想知道是否可以从 docker 容器本身稳定数据库连接。这就像在 docker 容器中创建连接实例一样。docker run -e "ACCEPT_EULA=Y" -e "MSSQL_PID=Developer" -e "MSSQL_SA_PASSWORD=**sqlpassword**" -e "MSSQL_TCP_PORT=1433" -p 1433:1433 -d --name **sqlcontainername** --network **networkname** sqlserver:2022-latest

答: 暂无答案