Подключитесь к MSSQL с помощью python jaydebeapi из образа Docker

У меня есть код Python, который правильно работает в моей системе (Mac OS Catalina), но дает сбой, когда я использую его в своем образе докера. Я также открыт для создания совершенно нового файла докеров, если это сработает.

import pandas as pd
import jaydebeapi
import argparse
import json
from datetime import datetime
import os


def read_data():
    MSSQL_DRIVER = "net.sourceforge.jtds.jdbc.Driver"
    host = 'server_name'
    port = '1433'
    user = 'user'
    password = 'password'
    db_url = f"jdbc:jtds:sqlserver://{host}:{port};"
    connection_properties = {
    "user": user,
    "password": password
    }
    jar_path = './jtds-1.3.1.jar'
    connection = jaydebeapi.connect(MSSQL_DRIVER, db_url, connection_properties, jar_path)
    query = 'SELECT TOP 10 * FROM table_name;'
    data = pd.read_sql_query(query,connection)
    print(data)
    connection.close()

if __name__ == "__main__":
    read_data()

У меня есть файл jar рядом с моим кодом, чтобы его можно было правильно подобрать.

Вот мой докерфайл:

FROM alpine:3.7
RUN apk update \
&& apk upgrade \
&& apk add --no-cache bash \
&& apk add --no-cache --virtual=build-dependencies unzip \
&& apk add --no-cache curl \
&& apk add --no-cache openjdk8-jre
RUN apk add --no-cache python3 \
&& python3 -m ensurepip \
&& pip3 install --upgrade pip setuptools \
&& rm -r /usr/lib/python*/ensurepip && \
if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi && \
rm -r /root/.cache
RUN apk add make automake gcc g++ subversion python3-dev
RUN pip install --trusted-host pypi.python.org flask
ENV JAVA_HOME = "/usr/lib/jvm/java-1.8-openjdk"
EXPOSE 8000 
WORKDIR /usr/src/app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY jtds-1.3.1.jar .
COPY server.py .
CMD ["python", "server.py"]

Ошибка, которую я получаю:

Error occurred during initialization of VM
Unable to load native library: Error loading shared library libjvm.so: No such file or directory (needed by /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/libjava.so)

Пожалуйста, предложите мне лучший dockerfile, который я могу использовать. Спасибо за помощь :)

Я видел несколько решений для этого здесь, но я все еще не уверен, что это правильный путь.

Krishna Agarwal 05.05.2022 15:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы используете это на Apple Silicon Mac?

Когда я создаю ваш образ (я использую Apple Silicon Mac), я могу убедиться, что /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/libjava.so не существует. Вместо этого в /usr/lib/jvm/java-1.8-openjdk/jre/lib/aarch64.

Однако, если я соберу образ и установлю платформу amd как

FROM --platform=linux/x86_64  alpine:3.7
RUN apk update \
&& apk upgrade \
...

файл есть. подозреваю, что это и ваша проблема

alex@laptop ~/r/_/docker_test> docker run --entrypoint /bin/sh -it <image>
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
/ # ls /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64
jli                  libj2gss.so          libjawt.so           libnpt.so
jvm.cfg              libj2krb5.so         libjdwp.so           libsplashscreen.so
libattach.so         libj2pcsc.so         libjsdt.so           libsunec.so
libawt.so            libj2pkcs11.so       libjsig.so           libunpack.so
libawt_headless.so   libj2sctp.so         libjsound.so         libverify.so
libawt_xawt.so       libjaas_unix.so      libjsoundalsa.so     libzip.so
libdt_socket.so      libjava.so           libmanagement.so     server
libfontmanager.so    libjava_crw_demo.so  libmlib_image.so
libhprof.so          libjavajpeg.so       libnet.so
libinstrument.so     libjavalcms.so       libnio.so

Привет, @alex, ну, я не думаю, что дело было в том, откуда я его запускал, потому что я на Mac, и у меня такой же путь, как у вас, а именно: /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server Мне просто нужно было установить его в одном шагов моего образа докера.

Krishna Agarwal 05.05.2022 22:48

@KrishnaAgarwal, если вы войдете в свой контейнер с помощью docker run --entrypoint /bin/sh -it <image_id> и запустите ls /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/libjava.so, файл там?

Alex 06.05.2022 02:36

Привет @Alex, файл существует в этой папке /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server. Также проверьте мой ответ, я смог взломать этот.

Krishna Agarwal 09.05.2022 09:21
Ответ принят как подходящий

Решение найдено, все, что мне нужно было сделать, это добавить следующую строку в мой файл докеров.

ENV LD_LIBRARY_PATH = "/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server"

В остальном то же самое, и это сработало как шарм! Я пробовал работать с pymssql, pyodbc (FreeTDS), и у меня ничего не получалось.

Другие вопросы по теме