docker镜像alpine中安装oracle客户端

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

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的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解Docker中安装配置Oracle数据库

    本文使用的OS是Ubuntu([16.04.1_server][1])[注:Ubuntu是安装在vmware虚拟机上的]. 其他的Oracle连接工具:[sqldeveloper-4.1.5.21.78-x64][2] 或[navicat-premium][3]. 1.docker search oracle ---------------------查看docker仓库中的oracle相关内容. docker search oracle 可以看到下图所示的信息: 2.docker pull s

  • 解析Docker 下拉取oracle 11g镜像配置的问题

    1.拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 镜像详情:https://dev.aliyun.com/detail.html?spm=5176.1972343.2.8.E6Cbr1&repoId=1969 由于镜像我已经拉取,所以此处显示已存在,查看镜像信息 docker iamges 2.创建并容器信息 docker run -d -p 1521:1521 --name oracle_11g re

  • Docker安装Oracle19c史上最全步骤

    目录 介绍 前期准备 Docker安装 Oracle 19c安装 第一步:下载镜像 第二步:创建挂载文件 第三步:安装Oracle 第四步:连接Oracle 介绍 Oracle Database 19c ,也就是12.2.0.3,最初在livesql.oracle.com上发布,是Oracle Database 12c和18c系列产品的最终版本,因此也是“长期支持”版本(以前称为“终端版本”). “长期支持”意味着Oracle Database 19c提供4年的高级支持(截止到2023年1月底)

  • 在Docker上安装配置Oracle教程

    由于工作需要,但是对于Docker 又是一窍不通,网上的资料又很少,真是一个头两个大.好歹最后终于找了各种资料终于捣鼓成功. 地址:https://github.com/wnameless/docker-oracle-xe-11g .直接 Git clone 到本地就行了 安装 Docker shell 下: docker pull wnameless/oracle-xe-11g 运行,并开放 49160 和 49161 端口,分别对应 22 端口和 Oracle 端口(SSH 和 oracle

  • Docker 拉取 oracle 11g镜像配置的详细教程

    话不多说 开始记录docker拉取阿里的oracle11g 镜像并进行配置, 用pl/sql 可以登录为最终结果 navicat连接是在最后一步 参考:https://www.jb51.net/article/223375.htm 但是根据这个进行配置会有一些问题,所以写这篇记录一下,希望可以帮助其他人 开始: ①.开始拉取镜像-执行命令: docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 下载的过程少长,等待吧,喝

  • Docker安装Oracle_11g的方法

    Docker安装Oracle_11g 1.拉取oracle_11g镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 2.创建oracle11g容器 docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 3.查看oracle11g容器是否创建成功 docker ps -a 4

  • 使用Docker快速搭建Oracle开发环境的方法教程

    前言 oracle太大了,对于开发人员来说,在本机安装一个oracle代价不菲. 在docker环境中,我找了很久,发现wnameless/oracle-xe-11g 镜像还不错,很方便搭建起来. 但是也发现一个问题,挂载本地卷遇到了麻烦.一旦挂载,就无法登陆了.从官方的issues中发现,有一个fork版本解决了这个问题,记录一下. 创建docker-compose工作目录 mkdir -p oracle/data cd oracle touch docker-compose.yml 配置do

  • docker镜像alpine中安装oracle客户端

    目录 1.背景 2.下载instant_client程序包 3.Dockerfile 说明: 4.遇到的问题 4.1.找不到libclntsh.so动态连接库 4.2.找不到libaio.so.1动态连接库 4.3.找不到libnsl.so.1动态连接库 1.背景 有项目需使用python连接oracle数据库,然后查询一些数据进行分析.在安装oracle客户端驱动过程中遇到了一些问题,在此记录下来分享读者.一点限制: oracle数据库与本应用程序不在同一台机器上,数据连接为远程访问方式,针对

  • Linux下安装oracle客户端并配置php5.3

    因项目需要在linux下进行php5.3的oracle客户端编译,简要介绍一下步骤及走过的弯路. 1.下载Oracle客户端程序包,其中包含OCI.OCCI和JDBC-OCI等相关文件. 1.1下载文件地址 http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 根据操作系统的版本选择对应的软件,我需要的是X86_64选择 Instant Client for Linux x86-6

  • CentOS8下安装oracle客户端完整(填坑)过程分享(推荐)

    oracle32位客户端安装 首先uname -a Linux localhost.localdomain 4.18.0-80.el8.x86_64 #1 SMP Tue Jun 4 09:19:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux cat /etc/redhat-release CentOS Linux release 8.0.1905 (Core) 可以看到我的电脑是64位,系统版本是CentOS8,然而服务器oracle数据库是32位的,所以

  • redhat 4中安装Oracle 10g图文教程

    --注:本篇文章只装Oracle,并没有建库 一:在虚拟机里装个readhat4系统 二:配IP 配好之后的IP如下: 三:建用户组,用户 注意:oracle用户应具有相同的uid. groupadd-g200oinstall groupadd-g201dba useradd-u200-goinstall-Gdbaoracle passwdoracle 四:建目录 修改文件的所有者 --chown-Roracle:oinstall/u01 su-oracle mkdir-p/u01/app/or

  • 使用Docker制作Python环境连接Oracle镜像

    目录 Python连接Oracle本地测试 依赖安装准备 制作Docker镜像 Python连接Oracle本地测试 依赖安装准备 Python.链接Oracle需要Python依赖和本地Oracle客户端,测试环境Oracle版本12.1.0.2.0,开发和测试环境为linux,先安装linux客户端,选择zip解压免安装版本 Oracle linux客户端 解压到某个目录 unzip instantclient-basic-linux.x64-12.1.0.2.0.zip 解压后新建/net

  • windows本地安装配置oracle客户端完整流程(图文版)

    因为工作需要,需要通过本地oracle客户端将数据导入到远程服务器上的oracle数据库中.从csdn下了很多oracle客户端,都是属于精简版,缺少imp.exe文件,造成无法导入数据.所以最终从oracle官网下载了oracle客户端标准版,标准版的oracle客户端大小570Mb左右,地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html

  • 详解docker 制作mysql镜像并自动安装脚本

    centos7环境下 一键制作mysql docker镜像,并安装 centos7环境下 一键制作mysql docker镜像,并安装 shell脚本内容如下: #docker自动安装mysql echo -e "\033[32m '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&

  • Jenkins打包微服务构建Docker镜像运行的实现

    目录 环境准备 开始 1.GitLab远程仓库创建微服务项目 2.IDEA代码推送到Gitlab 3.Jenkins创建流水线项目 4.参数化构建 5.拉取远程仓库的构建脚本 6.编写远程审查脚本sonar-project.properties 构建脚本 环境准备 1.Jenkins 2.GitLab 3.SonarQube 4.Harbor 5.Docker 6.Maven 7.JDK1.8 8.微服务项目 以上技术部分在我之前的文章中有写过 这里就不过多细化的演示,本文章主要是连贯性的将微服

  • Alpine Docker镜像字体的问题解决操作

    1.运行 fonts ,打开字体文件夹,找到要用的字体文件: 2.修改Dockerfile,例如: FROM alpine-jdk ADD ./test.jar /opt/App/test.jar #拷贝字体文件 COPY ./simhei.ttf /usr/share/fonts/simhei.ttf #设置字符集 ENV LANG en_US.UTF-8 #安装字体软件,完成字体配置 RUN apk add --update ttf-dejavu fontconfig && rm -r

随机推荐