Ошибка загрузки драйвера Teradata ODBC в докер для проекта Python - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь подключиться к базе данных 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

1 Ответ

0 голосов
/ 27 апреля 2019

Ошибка показывает, что ОС не может разрешить символ _toupper при загрузке двоичной библиотеки драйвера ODBC. Стандартные функции C, такие как toupper, snprintf и т. Д., Предоставляются библиотекой времени выполнения C.

Для минимизации размера изображения Alpine Linux построен на основе стандартной реализации языка C. В большинстве других дистрибутивов Linux используется библиотека GNU C (glibc). Musl предназначен для облегченной и быстрой реализации, соответствующей стандартам ISO C и POSIX, поэтому большинство приложений не требуют минимальных изменений исходного кода для компиляции с использованием musl. Однако совместимость ABI (двоичный интерфейс приложения) весьма ограничена, поэтому многие двоичные файлы, скомпилированные с помощью glibc, не будут работать с musl.

Если перекомпиляция драйвера ODBC из исходного кода невозможна, самый простой подход - это переключиться с Alpine на базовый образ, имеющий время выполнения glibc, как того требует двоичный файл драйвера ODBC.

...