Я пытаюсь подключиться к базе данных Teradata с помощью модуля python 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 ::
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" ]
Код Python ::
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)
Ожидаемый результат :: Печать первых 5 строк таблицы EMPLOYEE.
Последняя копия файла Docker с использованием ОС RHEL :
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