我正在尝试使用python teradata模块连接到Teradata数据库。但是当我在 docker 中运行我的应用程序时,我遇到了以下异常::
File "/usr/local/lib/python3.7/site-packages/teradata/udaexec.py", line 183, in connect
**args))
File "/usr/local/lib/python3.7/site-packages/teradata/tdodbc.py", line 421, in __init__
init(odbcLibPath)
File "/usr/local/lib/python3.7/site-packages/teradata/tdodbc.py", line 366, in init
initOdbcLibrary(odbcLibPath)
File "/usr/local/lib/python3.7/site-packages/teradata/tdodbc.py", line 319, in initOdbcLibrary
odbc = ctypes.cdll.LoadLibrary(odbcLibPath)
File "/usr/local/lib/python3.7/ctypes/__init__.py", line 434, in LoadLibrary
return self._dlltype(name)
File "/usr/local/lib/python3.7/ctypes/__init__.py", line 356, in __init__
self._handle = _dlopen(self._name, mode)
OSError: Error relocating /opt/teradata/client/16.20/lib64/libodbc.so: _toupper: symbol not found
我在Windows机器中运行相同的代码,但问题是当我在Docker中运行相同的代码时。在我的Windows机器中,我安装了Teradata ODBC 16.20,但是当我尝试在docker中做同样的事情时,也许我错过了一些东西,因为我是docker的新手。
码头工人文件 ::
FROM python:alpine3.7
ADD test.py /
USER root
ADD tdodbc1620__linux_indep.16.20.00.54-1.tar.gz /tmp/
RUN apk add rpm
RUN rpm -ivh /tmp/tdodbc1620/tdodbc1620-16.20.00.54-1.noarch.rpm --prefix=/opt/ --nodeps
RUN cp /opt/teradata/client/ODBC_64/odbc.ini ~/.odbc.ini
RUN cp /opt/teradata/client/ODBC_64/odbcinst.ini ~/.odbcinst.ini
RUN pip install --upgrade pip
RUN pip install teradata
ENV ODBCHOME=/opt/teradata/client/ODBC_64/ ODBCINI=/opt/teradata/client/ODBC_64/odbc.ini ODBCINST=/opt/teradata/client/ODBC_64/odbcinst.ini
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/opt/teradata/client/16.20/lib64
RUN chown -R root /opt/teradata/client/16.20/lib64/*.so
CMD [ "python", "./test.py" ]
蟒蛇代码 ::
import teradata
udaExec = teradata.UdaExec (appName="HelloWorld", version="1.0", logConsole=False)
session = udaExec.connect(method='odbc', system='xyz.com', username='xyz', password='xyz', AUTHENTICATION='LDAP')
with session as connect :
for row in connect.execute("`select top 5 * from EMPLOYEE;`"):
print(row)
预期结果 :: 打印 EMPLOYEE 表中的前 5 行。
使用 RHEL 操作系统的 Docker 文件的最新副本:
FROM quay.********/rhel:latest
ADD test.py /
USER root
RUN yum --nogpgcheck -y install unzip sudo vim wget which tar gzip graphviz python-setuptools python-setuptools-devel shadow-utils git net-tools libXtst.x86_64 python-pip
RUN yum -y install libgcc_s.so.1
RUN yum -y install libstdc++.so.6
ADD tdodbc1620__linux_indep.16.20.00.54-1.tar.gz ./
RUN cd /tdodbc1620/ &&
./setup_wrapper.sh -s -r tdodbc1620-16.20.00.54-1.noarch.rpm
RUN pip install teradata
ENV ODBCHOME=/opt/teradata/client/ODBC_64
ENV ODBCINI=$ODBCHOME/odbc.ini
ENV ODBCINST=$ODBCHOME/odbcinst.ini
ENV LD_LIBRARY_PATH=$ODBCHOME/lib:$LD_LIBRARY_PATH
该错误显示操作系统在加载 ODBC 驱动程序的二进制库时无法解析符号_toupper
。标准的C函数如toupper
、snprintf
等由C运行时库提供。
为了最小化图像大小,Alpine Linux建立在标准C运行时的musl实现之上。大多数其他Linux发行版使用GNU C库(glibc(。Musl 被设计为符合 ISO C 和 POSIX 标准的轻量级和快速实现,因此大多数应用程序不需要或很少的源代码更改即可使用 musl 进行编译。然而,ABI(应用程序二进制接口(兼容性非常有限,因此许多使用 glibc 编译的二进制文件将无法使用 musl 运行。
如果无法从源代码重新编译 ODBC 驱动程序,最简单的方法是从 Alpine 切换到具有 glibc 运行时的基本映像,这与 ODBC 驱动程序二进制文件的要求相同。