将 Oracle Instant 客户端安装到 Python cx_Oracle 的 Docker 容器中



我正在尝试通过我的 docker 容器连接到我公司的 Oracle 数据库,该容器包含我的一些带有包cx_Oracle的 python 脚本。构建并运行容器后,出现以下错误:

conn = cx_Oracle.connect("{0}/{1}@{2}".format(configOracle["username"], configOracle["password"],r"ed03:1521/configOracle["servername"]))
cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help

我有一个 Oracle 配置文件,其中的用户名、密码和服务器名称来自并正确填写。即使从 https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html 下载最新的客户端,我似乎也无法让它工作。

我的目录结构如下所示:

--TopDirectory
----instantclient
-------instantclient-basic-linux.x64-19.5.0.0.0dbru.zip
-------instantclient-sdk-linux.x64-19.5.0.0.0dbru.zip
----hello_oracle.py
----Dockerfile
----requirements.txt
----configOracle.json

这是我的 Dockerfile:

FROM python:3.7.5
#Oracle Client setup
ENV ORACLE_HOME /opt/oracle/instantclient_19_5
ENV LD_RUN_PATH=$ORACLE_HOME
COPY instantclient/* /tmp/
RUN 
    mkdir -p /opt/oracle && 
    unzip "/tmp/instantclient*.zip" -d /opt/oracle && 
    ln -s $ORACLE_HOME/libclntsh.so.19.1 $ORACLE_HOME/libclntsh.so
# Working directory
WORKDIR /src
# Copying requirements.txt before entire build step
COPY requirements.txt /src/requirements.txt
RUN pip install --upgrade pip
# Installing necessary packages
RUN pip install -r requirements.txt
# Copying rest of files
COPY . /src
CMD ["python3", "/src/hello_oracle.py"]

这是我的要求.txt文件:

pandas
numpy
matplotlib
keras
cx_Oracle
sklearn
tensorflow
pyopenssl
ndg-httpsclient
pyasn1

经过几个小时的尝试,我终于用这个 Dockerfile 解决了它

注意我 正在使用python 3.7,Django 3.0,Oracle Database 12c和Pipenv进行包管理

FROM python:3.7.5-slim-buster
# Installing Oracle instant client
WORKDIR    /opt/oracle
RUN        apt-get update && apt-get install -y libaio1 wget unzip 
            && wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip 
            && unzip instantclient-basiclite-linuxx64.zip 
            && rm -f instantclient-basiclite-linuxx64.zip 
            && cd /opt/oracle/instantclient* 
            && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci 
            && echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf 
            && ldconfig
WORKDIR    /app
COPY       . .  # Copy my project folder content into /app container directory
RUN        pip3 install pipenv
RUN        pipenv install
EXPOSE     8000
# For this statement to work you need to add the next two lines into Pipfilefile
# [scripts]
# server = "python manage.py runserver 0.0.0.0:8000"
ENTRYPOINT ["pipenv", "run", "server"]

最新版本的Oracle驱动程序被重命名为python-oracledb,现在默认是一个"瘦"驱动程序。它不需要即时客户端 - 它是可选的。 请参阅发布公告。Dockerfile 可以简单地像:

FROM python:3.10-bullseye
RUN python -m pip install oracledb

如果您希望选择使用python-oracledb的"Thick"模式,那么您可以使用Dockerfile,例如:

FROM python:3.10-bullseye
WORKDIR /opt/oracle
RUN apt-get update && apt-get install -y libaio1 
RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip && 
    unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && 
    cd /opt/oracle/instantclient* && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci && 
    echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
RUN python -m pip install oracledb

Oracle 在 https://github.com/oracle/docker-images/tree/master/OracleLinuxDevelopers 有 Python cx_Oracle Dockerfiles,在 https://github.com/orgs/oracle/packages 有 cx_Oracle 个容器

有一个由两部分组成的博客文章系列Docker for Oracle Database Applications in Node.js和Python,展示了各种安装方法。 这里还有一个关于cx_Oracle和Docker的Oracle网络广播录音。

如果您仍在使用 cx_Oracle 命名空间,则始终需要安装即时客户端,因此解决方案是使用:

FROM python:3.10-bullseye
RUN apt-get update && apt-get install -y libaio1
WORKDIR /opt/oracle
RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip && 
    unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && 
    cd /opt/oracle/instantclient* && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci && 
    echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
RUN python -m pip install cx_Oracle

如果使用不同的基础映像,则可能需要显式安装 wget 和解压缩。

最新更新