Cx_Oracle DatabaseError: DPI-1047

Я пытаюсь запустить свое Django-приложение в Docker, но получаю ошибку: cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "/root/lib/oracle/instantclient_23_4/libclntsh.so: cannot open shared object file: No such file or directory"

Само приложение работает на PostgreSQL, но также имеет подключение к Oracle

OS: Ubuntu Server

Я установил instantclient, создал переменную env через ~/.bashrc с помощью команды: export LD_LIBRARY_PATH=/root/lib/oracle/instantclient_23_4:$LD_LIBRARY_PATH, и добавил строку инициализации в файл python: cx_Oracle.init_oracle_client(lib_dir="root/lib/oracle/instantclient_23_4"), но я по-прежнему получаю вышеуказанную ошибку.

Если я запускаю файл напрямую: python3 omega_db.py, скрипт работает нормально и показывает подключение к базе данных, но если я запускаю его через docker-compose up, я получаю ошибку.

instantclient

Самое простое решение - использовать последнюю версию cx_Oracle. Она была переименована в python-oracledb и не нуждается в Instant Client, смотрите анонс релиза. Установите с помощью:

$ python3 -m pip install oracledb

Затем измените свой код, следуя Шагам по обновлению до python-oracledb и, в вашем случае, удалив все вызовы init_oracle_client(), чтобы не вызывать Instant Client.

Если вы используете Django 5, то у вас все получится: смотрите Django 5.0 поддерживает python-oracledb нативно. Если вы все еще используете более старую версию, то смотрите Using python-oracledb 1.0 with SQLAlchemy, Pandas, Django and Flask и добавьте эти несколько дополнительных строк в ваш файл настроек:

import sys
import oracledb
oracledb.version = "8.3.0"
sys.modules["cx_Oracle"] = oracledb

Если вы должны использовать cx_Oracle, то следуйте лучшим практикам настройки путей к библиотекам и используйте ldconfig вместо установки LD_LIBRARY_PATH. Похоже, что вы устанавливаете переменную не в том слое. Читать Docker для приложений Oracle Database на Node.js и Python.

Попробуйте сделать это в слое, где будет запущен Python:

$ echo /root/lib/oracle/instantclient_23_4 > /etc/ld.so.conf.d/oic.conf
$ ldconfig
Вернуться на верх