Docker容器中python-oracledb无法加载Oracle InstantClient问题排查
构建Oracle数据库访问Docker镜像时的DPI-1047错误排查
我在构建用于访问Oracle数据库的Docker镜像时,运行出现以下错误:
DPI-1047: Cannot locate a 64-bit Oracle Client library: "/oracle/instantclient/libclntsh.so: cannot open shared object file: No such file or directory".
但容器内确实存在/oracle/instantclient/libclntsh.so符号链接,求助排查思路。
相关配置文件
Dockerfile
FROM python:3.12-slim RUN apt-get update && \ apt-get install -y wget unzip libaio1 ARG ORACLE_HOME=/oracle ARG ORACLE_CLIENT_HOME=${ORACLE_HOME}/instantclient # Download and install Oracle instantclient RUN mkdir /tmp/oracle && \ wget https://download.oracle.com/otn_software/linux/instantclient/1920000/instantclient-basic-linux.x64-19.20.0.0.0dbru.zip -P /tmp/oracle && \ unzip /tmp/oracle/instantclient-basic-* -d /tmp/oracle && \ mkdir ${ORACLE_HOME} && \ mv /tmp/oracle/instantclient_* ${ORACLE_CLIENT_HOME} ENV LD_LIBRARY_PATH="${ORACLE_CLIENT_HOME}" RUN pip install --upgrade pip && \ pip install pipenv ENV PIPENV_VENV_IN_PROJECT=1 WORKDIR /app ADD main.py Pipfile Pipfile.lock ./ RUN pipenv sync ENTRYPOINT ["./.venv/bin/python", "main.py"] CMD [""]
main.py
import os import oracledb def print_db_version(db_config): params = oracledb.ConnectParams(host=db_config['host'], port=db_config['port'], service_name=db_config['name']) with oracledb.connect(user=db_config['username'], password=db_config['password'], params=params) as conn: print(f'Database version: {conn.version}') conn.close() if __name__ == '__main__': # Both calls below fail... # oracledb.init_oracle_client() oracledb.init_oracle_client(os.environ['LD_LIBRARY_PATH']) db_config = { 'host': os.environ['DB_HOST'], 'port': os.environ['DB_PORT'], 'name': os.environ['DB_NAME'], 'username': os.environ['DB_USERNAME'], 'password': os.environ['DB_PASSWORD'], } print_db_version(db_config)
Pipfile
[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] oracledb = "1.4.2"
执行命令
docker build -t my-version . docker run my-version docker run -it --entrypoint "" my-version bash
编辑1
按照Anthony Tuininga的建议操作后,输出显示LD_LIBRARY_PATH已正确设置,程序也在指定目录搜索,但仍无法加载库。
编辑2
尝试直接调用init_oracle_client(),发现程序未使用LD_LIBRARY_PATH,转而在Python虚拟环境中搜索,且出现libaio.so.1缺失错误。
编辑3
根据Christopher的回答,已在Dockerfile中添加libaio1包的安装。
内容的提问来源于stack exchange,提问作者Géraud
相关产品推荐
相关产品推荐

