提问人:ClearNote97 提问时间:11/4/2023 最后编辑:marc_sClearNote97 更新时间:11/4/2023 访问量:30
手动连接两个 Docker 容器:SQL Server 和 Jupyter Lab - 错误:(“IM004”)
Manually connecting two Docker containers: SQL Server and Jupyter Lab - Error: ('IM004')
问:
我目前在一家医疗保健公司担任数据分析师,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连接,并且运行良好。
如果有人能帮我解决这个问题,我会很高兴。
答: 暂无答案
评论
/etc/odbcinst.ini
Driver=/usr/lib/x86_64-linux-gnu/libodbc.so.2
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.5.1
cat /etc/os-release
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