返回顶部
首页 > 资讯 > 数据库 >docker镜像alpine中安装oracle客户端
  • 805
分享到

docker镜像alpine中安装oracle客户端

docker镜像alpine安装oracledocker alpine安装oracle 2022-06-28 12:06:29 805人浏览 泡泡鱼
摘要

目录1.背景2.下载instant_client程序包3.Dockerfile说明:4.遇到的问题4.1.找不到libclntsh.so动态连接库4.2.找不到libaio.so.1动态连接库4.3.找不到libnsl.

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】,试验成功!

以上就是docker镜像alpine中安装oracle客户端的详细内容,更多关于docker镜像alpine安装oracle的资料请关注我们其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: docker镜像alpine中安装oracle客户端

本文链接: https://lsjlt.com/news/33075.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • docker镜像alpine中安装oracle客户端
    目录1.背景2.下载instant_client程序包3.dockerfile说明:4.遇到的问题4.1.找不到libclntsh.so动态连接库4.2.找不到libaio.so.1动态连接库4.3.找不到libnsl....
    99+
    2022-06-28
    docker镜像alpine安装oracle docker alpine安装oracle
  • docker中如何安装ceph rbd客户端
    这篇文章主要介绍docker中如何安装ceph rbd客户端,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ceph rbd客户端要求客户端系统内核 2.6.32以上另外,我这个环境中把k9s-master1当做cep...
    99+
    2023-06-04
  • 安装Oracle 11gR2客户端
    安装Oracle 11gR2客户端 介绍如何安装Oracle 11gR2数据库客户端。 export DISPLAY=192.168.1.1:0.0 192.168.1.1为Xmanager所在主机的IP...
    99+
    2024-04-02
  • 安装oracle即时客户端
    一、需求    数据库和应用没在同一台主机上,所以需要安装oracle即时客户端,也可以是oracle的客户端。只不过客户端比较庞大。二、安装oracle即时客户端 下载Oracle即时...
    99+
    2024-04-02
  • Oracle客户端的安装步骤
    本篇内容主要讲解“Oracle客户端的安装步骤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle客户端的安装步骤”吧!一、压缩包下载登录网站https:...
    99+
    2024-04-02
  • aix怎么安装oracle客户端
    本篇内容介绍了“aix怎么安装oracle客户端”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 环境ro...
    99+
    2024-04-02
  • oracle instantclient 简易客户端安装
    以下是Oracle Instant Client简易客户端安装的步骤:1. 下载Oracle Instant Client软件包:-...
    99+
    2023-09-06
    oracle
  • docker怎么安装ubuntu镜像
    要安装Ubuntu镜像,您需要执行以下步骤: 首先,确保您已经安装了Docker。如果您还没有安装Docker,请根据您的操作系...
    99+
    2023-10-26
    docker ubuntu
  • rhel6.4 自动安装oracle 11g客户端
    1、安装过程 点击(此处)折叠或打开 ...
    99+
    2024-04-02
  • 怎么在CentOS8系统中安装oracle客户端
    怎么在CentOS8系统中安装oracle客户端?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。oracle32位客户端安装首先uname ...
    99+
    2024-04-02
  • docker中安装elasticsarch等镜像的过程
    1、在dockerhub中查找镜像 2、查看镜像下的说明,如下图标识成功 a、安装elasticsearch 运行命令 docker run --name myes01 -d -p ...
    99+
    2022-12-26
    docker安装elasticsarch镜像 docker安装elasticsarch docker elasticsarch镜像
  • linux下以RPM包安装Oracle 客户端
    一、下载oracle linux_x86-64客户端下载地址:http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html根据需要...
    99+
    2024-04-02
  • win7-64系统安装oracle 11G客户端
        Win7 -64位系统安装oracleinstant client 32时,安装路径不能有空格D:\Oracle\InstantClient,否则PLSQL Developer ...
    99+
    2024-04-02
  • Oracle 12.2简易客户端安装配置
    安装Oracle客户端挺费时间的,而且大部分功能都用不到,Oracle官方给出了简易客户端,直接解压就可以使用,下载地址:http://www.oracle.com/technetwork/topics/l...
    99+
    2024-04-02
  • oracle数据库客户端如何安装
    要安装Oracle数据库客户端,您可以按照以下步骤操作:1. 首先,访问Oracle官方网站(https://www.oracle....
    99+
    2023-09-05
    oracle数据库
  • docker安装mysql、redis镜像方式
    目录docker安装mysql、Redis镜像redis安装下载mysql安装下载docker安装使用及用docker安装mysql,Redis,nacos安装docket常用命令使用docker安装MySQL使用doc...
    99+
    2023-04-26
    docker安装mysql redis镜像 docker mysql
  • Mysql客户端的安装
    Mysql数据库(简称)属于C/S架构,正常工作中一般都会提供服务端,我们只需要安装客户端进行查询修改数据等操作即可。 正常工作中不管是测试人员或者开发人员,一般数据库的管理员(测试负责人或者开发负责人)都会提供我们数据库的相关信息,如下...
    99+
    2021-12-19
    Mysql客户端的安装
  • Docker下安装Mongo4.2及客户端工具连接Mongo
    目录Mongo物理安装可以参考之前写的:Docker下安装Mongo4.2和客户端工具连接Mongo1、docker pull mongo:version:拉取对应版本的镜像2、查看...
    99+
    2024-04-02
  • Ubuntu 16.04下安装数据库Oracle客户端
    在 Ubuntu 16.04下安装 Oracle数据库客户端,使用sqlplus工具连接到远程Oracle数据库。 1. 下载oracle客户端安装包: 进入官网https://www.oracl...
    99+
    2024-04-02
  • Docker如何安装配置Redis镜像
    这篇文章主要介绍Docker如何安装配置Redis镜像,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言如何安装Redis镜像,创建Redis容器并且映射端口挂载数据卷和配置数据。环境CentOS 7Docker 2...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作