Python アプリから Oracle データベースに繋ぐ必要があり Python クライアントを入れる Dockerfile を書いたのだが、やたら苦労したので備忘録として書いておく。
Dockerfile
FROM python:3.7
RUN pip install cx_Oracle
# Install Oracle Client
ENV ORACLE_HOME=/opt/oracle
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
RUN apt-get update && apt-get install -y libaio1 && rm -rf /var/lib/apt/lists/* \
&& wget -q https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-basic-linux.x64-19.6.0.0.0dbru.zip \
&& unzip instantclient-*.zip \
&& mkdir -p $ORACLE_HOME \
&& mv instantclient_19_6 $ORACLE_HOME/lib \
&& rm -f instantclient-*.zip
cx_Oracle 8 Initialization — cx_Oracle 8.0.0 documentation
公式ドキュメントによると、cx_Oracle を利用するためには Oracle Client ライブラリがインストールされている必要があり、cx_Oracle は次の順序でライブラリの読み込みを試行する。
-
cx_Oracle.init_oracle_client(lib_dir="...")
で指定したパス - OS のライブラリパス (
$LD_LIBRARY_PATH
) $ORACLE_HOME/lib
このうち 1.
と 3.
の方法で試したときに、他のライブラリは読み込めるのに libnnz19.so
だけ「そんなファイルは無い」などとエラーが出て大変困った。
原因はいまだにわからない。
2.
の方法を試したところ問題なく読み込まれた。