最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

docker鏡像alpine中安裝oracle客戶端

 更新時(shí)間:2022年06月28日 10:55:34   作者:tianxiawuzhe  
這篇文章主要為大家介紹了docker鏡像alpine中安裝oracle客戶端,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1.背景

有項(xiàng)目需使用python連接oracle數(shù)據(jù)庫,然后查詢一些數(shù)據(jù)進(jìn)行分析。在安裝oracle客戶端驅(qū)動(dòng)過程中遇到了一些問題,在此記錄下來分享讀者。
一點(diǎn)限制:

  • oracle數(shù)據(jù)庫與本應(yīng)用程序不在同一臺(tái)機(jī)器上,數(shù)據(jù)連接為遠(yuǎn)程訪問方式,針對(duì)同一臺(tái)機(jī)器的應(yīng)用訪問,網(wǎng)上有很多;
  • 本應(yīng)用支行在docker容器中,鏡像基于alpine:3.7版本編譯,針對(duì)在ubuntu中的安裝網(wǎng)上有很多;
  • 基礎(chǔ)信息:alping3.7 + python3.6.5 + cx_Oracle7.0.0 + instantclient-basic-linux.x64-11.2.0.4.0

搭建目標(biāo):

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

2.下載instant_client程序包

可直接從oracle 官網(wǎng)下載,本應(yīng)用下載了【instantclient-basic-linux.x64-11.2.0.4.0.zip】包。原因?yàn)樽詈门coracle數(shù)據(jù)庫版本對(duì)應(yīng)。

該壓縮包中有instanclient_11_2目錄,其目錄結(jié)構(gòu):

./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客戶端連接數(shù)據(jù)庫的所需的庫。

3.Dockerfile

直接先上代碼然后再說明其中的關(guān)鍵點(diǎn):

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)使用環(huán)境變量PACKAGES和BUILD_PACKAGES來區(qū)分應(yīng)用運(yùn)行時(shí)和編譯安裝時(shí)所需要的庫,在RUN命令最后刪除了BUILD_PACKAGES的依賴庫,從而保證鏡像盡可能的?。?/p>

02)PACKAGES中含有l(wèi)ibaio和libnsl兩個(gè)依賴庫,此2個(gè)依賴庫為cx_Oracle程序包所需的庫(更具體的是instant_client驅(qū)動(dòng)包中l(wèi)ibclntsh.so.11.1庫文件依賴這兩個(gè)包);

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

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

05)RUN第1步,【ln -s libclntsh.so.11.1 libclntsh.so】是建立驅(qū)動(dòng)包中軟連接,這樣cx_Oracle在尋找動(dòng)態(tài)連接庫時(shí)就能找到了,如果不軟連接或重命名,那么cx_Oracle將會(huì)找不到該庫;【ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so.1】建立libnsl庫的軟連接,當(dāng)libclntsh庫在運(yùn)行時(shí)會(huì)查找此庫;

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

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

08)RUN第4步,安裝運(yùn)行過程中所需的依賴包,此2步可調(diào)換順序,但個(gè)人覺得應(yīng)該這個(gè)順序,因?yàn)槿绻幾g的依賴包覆蓋了運(yùn)行所需的包,那么在刪除BUILD_PACKAGES后,程序運(yùn)行時(shí)就會(huì)出現(xiàn)問題;

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

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

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

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

4.遇到的問題

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

4.1.找不到libclntsh.so動(dòng)態(tài)連接庫

詳細(xì)信息:

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:

  • 未正確設(shè)置LD_LIBRARY_PATH環(huán)境變量,導(dǎo)致python在加載應(yīng)用時(shí),操作系統(tǒng)未設(shè)置正確的庫路徑;
  • 未設(shè)置軟連接libclntsh.so指向libclntsh.so.11.1,也會(huì)導(dǎo)致無法加載;

診斷方法:

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

4.2.找不到libaio.so.1動(dòng)態(tài)連接庫

請(qǐng)確認(rèn)libaio是否安裝成功,安裝成功后,應(yīng)該在/usr/lib/libaio.so.1.0.1文件,同時(shí)會(huì)存在libaio.so.1的軟連接。

4.3.找不到libnsl.so.1動(dòng)態(tài)連接庫

由于當(dāng)前l(fā)ibnsl的版本已經(jīng)是libns.so.2.0.0,因此在安裝libnsl后會(huì)自動(dòng)存在libnsl.so.2的軟連接,而本應(yīng)用中oracle的驅(qū)動(dòng)版本是較老的,因此直接手工建立了軟連接【ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so.1】,試驗(yàn)成功!

以上就是docker鏡像alpine中安裝oracle客戶端的詳細(xì)內(nèi)容,更多關(guān)于docker鏡像alpine安裝oracle的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Docker構(gòu)建Java鏡像并部署Java項(xiàng)目的完整步驟

    Docker構(gòu)建Java鏡像并部署Java項(xiàng)目的完整步驟

    這篇文章主要給大家介紹了關(guān)于Docker構(gòu)建Java鏡像并部署Java項(xiàng)目的完整步驟,Docker是一種容器化技術(shù),可以幫助開發(fā)者輕松打包應(yīng)用程序和依賴項(xiàng),并在任何地方運(yùn)行它們,需要的朋友可以參考下
    2023-10-10
  • centos7 安裝Jenkins詳細(xì)介紹

    centos7 安裝Jenkins詳細(xì)介紹

    這篇文章主要介紹了centos7 安裝Jenkins詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • 完美卸載Docker的詳細(xì)步驟

    完美卸載Docker的詳細(xì)步驟

    Docker是一種流行的容器化平臺(tái),但是有時(shí)候我們可能需要卸載Docker,無論是因?yàn)樾枰匦掳惭b版本,還是因?yàn)椴辉傩枰褂肈ocker,無論何種原因,正確地卸載Docker是很重要的,以確保系統(tǒng)的干凈和穩(wěn)定,下面跟大家詳細(xì)介紹如何徹底卸載Docker的方法,讓你能夠輕松地清理干凈
    2023-11-11
  • Docker到底是什么?Docker為什么它這么火!

    Docker到底是什么?Docker為什么它這么火!

    Docker這種新的容器技術(shù)可謂熱得發(fā)燙,因?yàn)橛辛怂?,人們就有可能讓?shù)量多得多的應(yīng)用程序在同樣的舊服務(wù)器上運(yùn)行;有了它,人們也很容易封裝和交付程序。本文旨在幫助你進(jìn)一步了解Docker
    2015-12-12
  • docker之如何設(shè)置日志文件大小及個(gè)數(shù)

    docker之如何設(shè)置日志文件大小及個(gè)數(shù)

    這篇文章主要介紹了docker之如何設(shè)置日志文件大小及個(gè)數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳細(xì)講解Docker虛擬化

    詳細(xì)講解Docker虛擬化

    本文詳細(xì)講解了Docker的虛擬化,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 帶你快速了解Docker和k8s的使用及說明

    帶你快速了解Docker和k8s的使用及說明

    這篇文章主要介紹了帶你快速了解Docker和k8s的使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Dokcer部署雙主Mysql的詳細(xì)步驟

    Dokcer部署雙主Mysql的詳細(xì)步驟

    文章介紹了如何創(chuàng)建MySQL主從復(fù)制容器,并配置主從關(guān)系,主要步驟包括創(chuàng)建容器、創(chuàng)建角色、配置MySQL從數(shù)據(jù)庫以連接到主數(shù)據(jù)庫,并確保配置參數(shù)正確,感興趣的朋友一起看看吧
    2025-01-01
  • 利用Docker制作Nginx+PHP鏡像的步驟詳解

    利用Docker制作Nginx+PHP鏡像的步驟詳解

    Nginx是一個(gè)高性能的Web和反向代理服務(wù)器,它具有很多非常優(yōu)越的特性,那么這篇文章小編就分步驟向大家介紹如何利用Docker制作Nginx+PHP的鏡像,文章介紹的很詳細(xì),對(duì)大家具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • 使用 Docker 在 Ubuntu 上部署 FTP 服務(wù)器的步驟

    使用 Docker 在 Ubuntu 上部署 FTP 服務(wù)器

    本文詳細(xì)介紹了如何在Ubuntu系統(tǒng)上通過Docker部署FTP服務(wù)器的步驟,包括安裝Docker、拉取vsftpd鏡像以及運(yùn)行FTP容器等,通過這些步驟,用戶可以在提供的免費(fèi)云服務(wù)器上快速搭建起一個(gè)安全高效的FTP服務(wù),適合小型項(xiàng)目或個(gè)人使用,感興趣的朋友跟隨小編一起看看吧
    2024-10-10

最新評(píng)論

东台市| 荣昌县| 北宁市| 兴业县| 闽清县| 广安市| 宾川县| 永和县| 香港| 安义县| 定边县| 博客| 万源市| 黄浦区| 灵石县| 织金县| 龙海市| 库尔勒市| 东阳市| 宽甸| 宜州市| 西城区| 安西县| 勐海县| 新泰市| 房产| 揭西县| 那曲县| 永泰县| 田林县| 瑞安市| 崇左市| 云龙县| 来宾市| 兴安盟| 剑阁县| 义马市| 新闻| 崇州市| 克什克腾旗| 双牌县|