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, я получаю ошибку.
Самое простое решение - использовать последнюю версию 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