Это мой Dockerfile:
Код: Выделить всё
FROM --platform=linux/amd64 python:3.12-slim AS build
# FROM --platform=linux/arm64 python:3.12-slim AS build
# install common dependencies
RUN apt update -y && apt install -y curl gnupg unixodbc unixodbc-dev wget
# install sqlserver odbc driver
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg && \
curl https://packages.microsoft.com/config/debian/12/prod.list | tee /etc/apt/sources.list.d/mssql-release.list && \
apt update -y && ACCEPT_EULA=Y apt install -y msodbcsql18
# install mysql odbc driver
ARG MYSQL_CONNECTOR_ODBC=mysql-connector-odbc-9.0.0-linux-glibc2.28-x86-64bit
# ARG MYSQL_CONNECTOR_ODBC=mysql-connector-odbc-9.0.0-linux-glibc2.28-aarch64
RUN wget -q https://dev.mysql.com/get/Downloads/Connector-ODBC/9.0/${MYSQL_CONNECTOR_ODBC}.tar.gz && \
gunzip ${MYSQL_CONNECTOR_ODBC}.tar.gz && \
tar xvf ${MYSQL_CONNECTOR_ODBC}.tar && \
cp -r ${MYSQL_CONNECTOR_ODBC}/bin/* /usr/local/bin && \
cp -r ${MYSQL_CONNECTOR_ODBC}/lib/* /usr/local/lib && \
myodbc-installer -a -d -n "MySQL ODBC 9.0 Unicode Driver" -t "Driver=/usr/local/lib/libmyodbc9w.so"
# install python dependencies
RUN pip install -U pip pdm
ENV PYTHONPATH="${PYTHONPATH}:/app"
WORKDIR /app
COPY tasks/ingestion/[^task|Dockerfile]* ./
RUN pdm install --global --project .
COPY libraries/python/aws/ ./
COPY libraries/python/ingestion/ ./
COPY tasks/ingestion/task/ ./
CMD [ "python", "main.py" ]
Код: Выделить всё
import pyodbc
conn_str = "DRIVER={MySQL ODBC 9.0 Unicode Driver};SERVER=host.docker.internal;DATABASE=;UID=;PWD=;ENCRYPT=yes;TrustServerCertificate=yes;"
stmt = "select * from limit 500"
conn = pyodbc.connect(conn_str)
cursor = conn.execute(stmt)
Код: Выделить всё
import pyodbc
from arrow_odbc import read_arrow_batches_from_odbc
conn_str = "DRIVER={MySQL ODBC 9.0 Unicode Driver};SERVER=host.docker.internal;DATABASE=;UID=;PWD=;ENCRYPT=yes;TrustServerCertificate=yes;"
stmt = "select * from limit 500"
conn = pyodbc.connect(conn_str)
cursor = conn.execute(stmt)
reader = read_arrow_batches_from_odbc(query=stmt, connection_string=conn_str)
Код: Выделить всё
from arrow_odbc import read_arrow_batches_from_odbc
conn_str = "DRIVER={MySQL ODBC 9.0 Unicode Driver};SERVER=host.docker.internal;DATABASE=;UID=;PWD=;ENCRYPT=yes;TrustServerCertificate=yes;"
stmt = "select * from limit 500"
reader = read_arrow_batches_from_odbc(query=stmt, connection_string=conn_str)
Код: Выделить всё
import pyodbc
conn_str = "DRIVER={MySQL ODBC 9.0 Unicode Driver};SERVER=host.docker.internal;DATABASE=;UID=;PWD=;ENCRYPT=yes;TrustServerCertificate=yes;"
stmt = "select * from limit 500"
conn = pyodbc.connect(conn_str)
cursor = conn.execute(stmt)
from arrow_odbc import read_arrow_batches_from_odbc
reader = read_arrow_batches_from_odbc(query=stmt, connection_string=conn_str)
Код: Выделить всё
Traceback (most recent call last):
File "/app/test_odbc_ko.py", line 7, in
conn = pyodbc.connect(conn_str)
^^^^^^^^^^^^^^^^^^^^^^^^
pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/libmyodbc9w.so' : file not found (0) (SQLDriverConnect)")
Код: Выделить всё
Traceback (most recent call last):
File "/app/test_odbc_ko.py", line 1, in
File "/usr/local/lib/python3.12/site-packages/arrow_odbc/reader.py", line 495, in read_arrow_batches_from_odbc
reader.query(
File "/usr/local/lib/python3.12/site-packages/arrow_odbc/reader.py", line 102, in query
connection = connect_to_database(
^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/arrow_odbc/connect.py", line 59, in connect_to_database
raise_on_error(error)
File "/usr/local/lib/python3.12/site-packages/arrow_odbc/error.py", line 30, in raise_on_error
raise Error(error_out)
arrow_odbc.error.Error: ODBC emitted an error calling 'SQLDriverConnect':
State: 01000, Native error: 0, Message: [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/libmyodbc9w.so' : file not found
Я включил только пример драйвера MySql, потому что SqlServer не вызывает никаких проблем. Чтобы еще больше запутать ситуацию, если я создаю образ Docker на основе архитектуры Arm64 (я включил в Dockerfile строки с комментариями для переключения между архитектурами и относительно правильной версией драйвера odbc mysql), все работает как шарм.
Пожалуйста, помогите мне разобраться с этим и исправить это для архитектуры amd64. Заранее спасибо.
ОБНОВЛЕНИЕ 1 (2024-08-02):
Я пробовал разные вещи:
- Изменил Dockerfile для использования alpine и ubuntu в качестве базовых образов.
- Изменил метод установки соединителя mysql на распространение deb.
Подробнее здесь: https://stackoverflow.com/questions/788 ... libmyodbc9
Мобильная версия