日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

根据镜像安装oracle插件,docker镜像alpine中安装oracle客户端

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 根据镜像安装oracle插件,docker镜像alpine中安装oracle客户端 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.背景

有項目需使用python連接oracle數據庫,然后查詢一些數據進行分析。在安裝oracle客戶端驅動過程中遇到了一些問題,在此記錄下來分享讀者。

一點限制:

oracle數據庫與本應用程序不在同一臺機器上,數據連接為遠程訪問方式,針對同一臺機器的應用訪問,網上有很多;

本應用支行在docker容器中,鏡像基于alpine:3.7版本編譯,針對在ubuntu中的安裝網上有很多;

基礎信息:alping3.7 + python3.6.5 + cx_Oracle7.0.0 + instantclient-basic-linux.x64-11.2.0.4.0

搭建目標:

使用python -c "import cx_Oracle as ora; ora.connect('xxx')"可正常連接oracle數據庫

2.下載instant_client程序包

可直接從oracle 官網下載,本應用下載了【instantclient-basic-linux.x64-11.2.0.4.0.zip】包。原因為最好與oracle數據庫版本對應。

該壓縮包中有instanclient_11_2目錄,其目錄結構:

./instantclient_11_2:

|---BASIC_README

|---adrci

|---genezi

|---libclntsh.so.11.1

|---libnnz11.so

|---libocci.so.11.1

|---libociei.so

|---libocijdbc11.so

|---ojdbc5.jar

|---ojdbc6.jar

|---uidrvci

|---xstreeams.jar

即包中為oracle客戶端連接數據庫的所需的庫。

3.Dockerfile

直接先上代碼然后再說明其中的關鍵點:

FROM alpine:3.7

ENV ALPINE_VERSION=3.7

#### packages from https://pkgs.alpinelinux.org/packages

# These are always installed. Notes:

# * dumb-init: a proper init system for containers, to reap zombie children

# * bash: For entrypoint, and debugging

# * ca-certificates: for SSL verification during Pip and easy_install

# * python: the binaries themselves

# * openblas: required for numpy.

# * libaio libnsl: for cx_Oracle

ENV PACKAGES="\

dumb-init \

bash vim tini \

ca-certificates \

python3==3.6.5-r0 \

openblas \

libaio libnsl \

"

# These packages are not installed immediately, but are added at runtime or ONBUILD to shrink the image as much as possible. Notes:

# * build-base: used so we include the basic development packages (gcc)

# * linux-headers: commonly needed, and an unusual package name from Alpine.

ENV BUILD_PACKAGES="\

build-base \

linux-headers \

"

## for install oracle instant client

## from https://oracle.github.io/odpi/doc/installation.html#linux

ENV TNS_ADMIN=/oracle_client/instantclient_11_2

ENV NLS_LANG=SIMPLIFTED_CHINESE_CHINA_ZHS16GBK

ENV LD_LIBRARY_PATH=/oracle_client/instantclient_11_2

RUN echo \

# 1.install oracle client and create soft link

&& mkdir /oracle_client && cd /oracle_client \

&& wget -O client.zip "https://raw.githubusercontent.com/tianxiawuzhe/alpine37-py365-django21-ai/master/instantclient-basic-linux.x64-11.2.0.4.0.zip" \

&& unzip client.zip && rm client.zip \

&& cd /oracle_client/instantclient_11_2 \

&& ln -s libclntsh.so.11.1 libclntsh.so \

&& ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so.1 \

# 2.replacing default repositories with edge ones

&& echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \

&& echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \

&& echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories \

# 3.Add the build packages, and then will be deleted

&& apk add --no-cache --virtual=.build-deps $BUILD_PACKAGES \

# 4.Add the packages, with a CDN-breakage fallback if needed

&& apk add --no-cache $PACKAGES || \

(sed -i -e 's/dl-cdn/dl-4/g' /etc/apk/repositories && apk add --no-cache $PACKAGES) \

# 5.make some useful symlinks that are expected to exist

&& cd /usr/bin \

&& { [[ -e idle ]] || ln -s idle3 idle; } \

&& { [[ -e pydoc ]] || ln -s pydoc3 pydoc; } \

&& { [[ -e python ]] || ln -sf python3.6 python; } \

&& { [[ -e python-config ]] || ln -sf python3-config python-config; } \

&& { [[ -e pip ]] || ln -sf pip3 pip; } \

&& ls -l idle pydoc python* pip* \

&& python -m pip install --upgrade --no-cache-dir pip \

&& ls -l idle pydoc python* pip* \

# 6.install my app software

&& pip install --no-cache-dir cx_Oracle \

# 7.End

&& apk del .build-deps \

&& ls -l idle pydoc python* pip* \

&& echo

EXPOSE 8080

ENTRYPOINT tail -f /dev/null

CMD ["/bin/bash"]

說明:

01)使用環境變量PACKAGES和BUILD_PACKAGES來區分應用運行時和編譯安裝時所需要的庫,在RUN命令最后刪除了BUILD_PACKAGES的依賴庫,從而保證鏡像盡可能的小;

02)PACKAGES中含有libaio和libnsl兩個依賴庫,此2個依賴庫為cx_Oracle程序包所需的庫(更具體的是instant_client驅動包中libclntsh.so.11.1庫文件依賴這兩個包);

03)LD_LIBRARY_PATH環境變量保證在python程序運行時能夠找到instant_client的驅動包位置,本文中是將驅動包解壓至容器的/oracle_client/目錄下(解壓過程見后面的RUN里的unzip);

04)RUN中第1步,是從github上下載上面的驅動包。原因:本應用編譯時是使用公共云平臺進行編譯,在編譯過程中綁定了github,從github上讀取Dockerfile和*.zip文件進行編譯。若是在本地編譯鏡像,可以使用COPY或ADD來添加文件,但這樣可能會讓鏡像的大小增加,理由是COPY和ADD不能自動解壓縮zip,即使在RUN的后面寫上rm *.zip,也無法降低鏡像的大小,更多信息請查詢鏡像層的原理。

05)RUN第1步,【ln -s libclntsh.so.11.1 libclntsh.so】是建立驅動包中軟連接,這樣cx_Oracle在尋找動態連接庫時就能找到了,如果不軟連接或重命名,那么cx_Oracle將會找不到該庫;【ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so.1】建立libnsl庫的軟連接,當libclntsh庫在運行時會查找此庫;

06)RUN第2步,向/etc/apk/repositories文件中添加一些alpine特有的庫地址,后面在安裝時就能自動下載并安裝了;

07)RUN第3步,安裝編譯過程中所需的依賴包;

08)RUN第4步,安裝運行過程中所需的依賴包,此2步可調換順序,但個人覺得應該這個順序,因為如果編譯的依賴包覆蓋了運行所需的包,那么在刪除BUILD_PACKAGES后,程序運行時就會出現問題;

09)RUN第5步,建立一些python中簡單的軟連接,方便后面使用;同時更新了pip的版本;

10)RUN第6步,使用pip安裝cx_Oracle程序包;

11)RUN第7步,清理BUILD_PACKAGES這些依賴包;

12)最后就是暴露的端口和啟動腳本了;

4.遇到的問題

以下遇到的問題,均是通過執行【python -c "import cx_Oracle as o; o.connect('xxx')"】來驗證是否客戶端安裝成功。

4.1.找不到libclntsh.so動態連接庫

詳細信息:

cx_Oracle.DatabaseError:

DPI-1047: 64-bit Oracle Client library cannot be loaded:

"Error loading shared library libclntsh.so: No such file or directory".

See https://oracle.github.io/odpi/doc/installation.html#linux for help

原因有2:

未正確設置LD_LIBRARY_PATH環境變量,導致python在加載應用時,操作系統未設置正確的庫路徑;

未設置軟連接libclntsh.so指向libclntsh.so.11.1,也會導致無法加載;

診斷方法:

在python命令行里,手工【from ctypes import find_library as f, CDLL】,嘗試使用find_library來查找動態連接庫,如果能用此命令找到,比如f('libclntsh.so.11.1')可以找到,但f('libclntsh.so')找不到,說明LD_LIBRARY_PATH設置正確了,只是沒有軟連接。然后再用CDLL嘗試加載動態連接庫,看中間加載是否會出問題。

4.2.找不到libaio.so.1動態連接庫

請確認libaio是否安裝成功,安裝成功后,應該在/usr/lib/libaio.so.1.0.1文件,同時會存在libaio.so.1的軟連接。

4.3.找不到libnsl.so.1動態連接庫

由于當前libnsl的版本已經是libns.so.2.0.0,因此在安裝libnsl后會自動存在libnsl.so.2的軟連接,而本應用中oracle的驅動版本是較老的,因此直接手工建立了軟連接【ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so.1】,試驗成功!

4.完成

總結

以上是生活随笔為你收集整理的根据镜像安装oracle插件,docker镜像alpine中安装oracle客户端的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。