我正在尝试使用cx_Oracle(需要oracle Instant Client)从我的Alpine Linux容器建立oracle连接。 cx_oracle一直抱怨Oracle即时客户端所需的其他缺少的库
错误:
con = cx_Oracle.connect('user/pass@127.0.0.1/orcl')追溯(最近一次调用为最新):文件“”,第1行,位于
cx_Oracle.DatabaseError:DPI-1047:无法找到64位 Oracle客户端库:“加载共享库libnsl.so.1时出错:否 此类文件或目录(/usr/lib/libclntsh.so所需)”。
Dockerfile:
FROM alpine-base
COPY /app /base/app
COPY requirements.txt /base
COPY instantclient_12_2.zip /base
COPY instantclient_sqlplus_12_2.zip /base
COPY run_app.py /base
COPY oratest.py /base/oratest.py
WORKDIR /base
RUN apk add libaio libnsl openssl-dev musl-dev libffi-dev && \
apk add openssl-dev && \
pip install cryptography==2.2.2 && \
apk add libressl-dev && \
pip install cx_Oracle
unzip /base/instantclient_12_2.zip && \
unzip /base/instantclient_sqlplus_12_2.zip && \
mv /base/instantclient_12_2/ /usr/lib/ && \
rm -rf /base/instantclient_12_2.zip && \
ln /usr/lib/instantclient_12_2/libclntsh.so.12.1 /usr/lib/libclntsh.so && \
ln /usr/lib/instantclient_12_2/libocci.so.12.1 /usr/lib/libocci.so && \
ln /usr/lib/instantclient_12_2/libociei.so /usr/lib/libociei.so && \
ln /usr/lib/instantclient_12_2/libnnz12.so /usr/lib/libnnz12.so
ENV ORACLE_BASE /usr/lib/instantclient_12_2
ENV LD_LIBRARY_PATH /usr/lib/instantclient_12_2
ENV TNS_ADMIN /usr/lib/instantclient_12_2
ENV ORACLE_HOME /usr/lib/instantclient_12_2
RUN pip install -r /base/requirements.txt
EXPOSE 8080
CMD [ "python", "/base/run_app.py" ]
这里有什么我想念的吗? 我已经完成了与oracle Instant Client的依赖关系抗争的工作-是否有更好的方法从高山建立Oracle连接
我想看看是否有人在高山linux上成功运行cx_Oracle
答案 0 :(得分:1)
您可能可以安装libnsl来克服这一问题(https://pkgs.alpinelinux.org/package/edge/community/x86/libnsl),但是-我建议您避免使用Alpine。
全部都是为了缩小图像(假设对编译器的需求并没有使其最终变大)。
长版:https://pythonspeed.com/articles/base-image-python-docker-images/
答案 1 :(得分:0)
要重复我的earlier views:
我建议您使用Oracle支持的操作系统,这样可以避免黑客入侵Alpine的麻烦以及不确定在关键时刻它不会崩溃的不确定性。因此,您可以放心,您的业务不会受到负面影响。尝试https://github.com/oracle/docker-images/blob/master/OracleInstantClient/dockerfiles/19/Dockerfile