JupyterHub Oracle InstantClient 和 cx_Oracle 安装
JupyterHub Oracle InstantClient and cx_Oracle installation
我使用 Docker 容器安装了 JupyterHub。
我创建了一个新的 Anaconda 环境“cx_oracle_env”,并在终端中安装了软件包 cx_Oracle:
# Creates a new Anaconda Environment called "cx_oracle_env" using Python 3.7 in silent mode
conda create -n cx_oracle_env python=3.7 -y
# >>>> Returns no warnings / errors
# Activates the Anaconda Environment "cx_oracle_env"
conda activate cx_oracle_env
# >>>> Returns no warnings / errors
# Mamba is a reimplementation of the conda package manager in C++.
# - parallel downloading of repository data and package files using multi-threading
# - libsolv for much faster dependency solving, a state of the art library used in the
# RPM package manager of Red Hat, Fedora and OpenSUSE
# - core parts of mamba are implemented in C++ for maximum efficiency
# At the same time, mamba utilize the same command line parser, package installation and
# deinstallation code and transaction verification routines as conda to stay as compatible as
# possible.
#
conda install mamba -n base -c conda-forge -y
# >>>> Returns no warnings / errors
# Installs ipykernel in currently active Anaconda Environment
mamba install ipykernel -y
# >>>> Returns no warnings / errors
# Installs cx_Oracle
python -m pip install cx_Oracle --upgrade
# >>>> Returns no warnings / errors
# Binds ipykernel "cx_oracle_env" to Anaconda Environment "cx_oracle_env"
python -m ipykernel install --user --name cx_oracle_env --display-name="cx_oracle_env"
# >>>> Returns no warnings / errors
我从 [=19] 下载了 ORACLE InstantClient instantclient-basic-linux.x64-21.1.0.0.0.zip =] 到我的本地计算机,并将 zip 文件上传到我的 JupyterHub 工作目录。
我在启动器面板的笔记本部分选择“cx_oracle_env”打开了一个新的 Jupyter 笔记本。
在 Jupyter Notebook 中,我使用以下命令解压文件 instantclient-basic-linux.x64-21.1.0.0.0.zip:
from shutil import unpack_archive
# Decompress ZIP-file to working directory (/home/jovyan/instantclient_21_1/)
unpack_archive('instantclient-basic-linux.x64-21.1.0.0.0.zip', '')
>>>> Returns no warnings / errors
检查路径是否存在:
import os.path
from os import path
path.exists("/home/jovyan/instantclient_21_1")
# >>>> Returns True
设置LD_LIBRARY_PATH:
import os
os.environ["LD_LIBRARY_PATH"] = "/home/jovyan/instantclient_21_1"
!echo $LD_LIBRARY_PATH
# >>>> Returns /home/jovyan/instantclient_21_1
设置ORACLE_HOME:
os.environ["ORACLE_HOME"] = "/home/jovyan/instantclient_21_1"
!echo $ORACLE_HOME
# >>>> Returns /home/jovyan/instantclient_21_1
安装 libaio:
!mamba install libaio -y
# >>>> Returns no warnings / errors
导入cx_Oracle:
import cx_Oracle
# >>>> Returns no warnings / errors
调用 init_oracle_client 后,出现以下错误:
cx_Oracle.init_oracle_client(lib_dir=r"/home/jovyan/instantclient_21_1")
我错过了什么?
PS:不幸的是,我在 JupyterHub 终端中没有 sudo 权限...
不幸的是,环境变量 LD_LIBRARY_PATH
必须 在开始该过程之前设置,因此在 Python 脚本中更改它是行不通的。
此外,由于即时客户端当前构建方式的限制,cx_Oracle.init_oracle_client()
不能在 Linux 上使用,除非事先在进程外设置 LD_LIBRARY_PATH
。希望这个限制很快就会被取消,但与此同时,这是你必须做的。您还可以使用 ld.so.conf
配置使安装适用于您的整个机器,在这种情况下不再需要设置 LD_LIBRARY_PATH
。
我最终解决了这个问题,方法是通过自定义 https://github.com/jupyter/docker-stacks/blob/master/minimal-notebook/Dockerfile 中的 Dockerfile 创建一个新的 JupyterHub 环境,并将其作为新的“最小 Oracle 环境”嵌入到 JupyterHub 中。
自定义Dockerfile有以下内容(我只添加了“cx_Oracle安装begin/end”部分):
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
ARG BASE_CONTAINER=jupyter/base-notebook
FROM $BASE_CONTAINER
LABEL maintainer="Jupyter Project <jupyter@googlegroups.com>"
USER root
# Install all OS dependencies for fully functional notebook server
RUN apt-get update && apt-get install -yq --no-install-recommends \
build-essential \
vim-tiny \
git \
inkscape \
libsm6 \
libxext-dev \
libxrender1 \
lmodern \
netcat \
# ---- nbconvert dependencies ----
texlive-xetex \
texlive-fonts-recommended \
texlive-plain-generic \
# ----
tzdata \
unzip \
nano-tiny \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# cx_Oracle installation begin
WORKDIR /opt/oracle
RUN apt-get update && apt-get install -y libaio1 wget
RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip && \
unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \
cd /opt/oracle/instantclient* && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci && \
echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
RUN python -m pip install cx_Oracle
WORKDIR $HOME
# cx_Oracle installation end
# Create alternative for nano -> nano-tiny
RUN update-alternatives --install /usr/bin/nano nano /bin/nano-tiny 10
# Switch back to jovyan to avoid accidental container runs as root
USER $NB_UID
在本地构建自定义Dockerfile,并作为“Minimal Oracle environment”嵌入到Kubernetes Cluster中后,在新建的JupyterHub环境中启动了一个新的Jupyter Notebook,测试ORACLE connect如下:
我使用 Docker 容器安装了 JupyterHub。
我创建了一个新的 Anaconda 环境“cx_oracle_env”,并在终端中安装了软件包 cx_Oracle:
# Creates a new Anaconda Environment called "cx_oracle_env" using Python 3.7 in silent mode conda create -n cx_oracle_env python=3.7 -y # >>>> Returns no warnings / errors # Activates the Anaconda Environment "cx_oracle_env" conda activate cx_oracle_env # >>>> Returns no warnings / errors # Mamba is a reimplementation of the conda package manager in C++. # - parallel downloading of repository data and package files using multi-threading # - libsolv for much faster dependency solving, a state of the art library used in the # RPM package manager of Red Hat, Fedora and OpenSUSE # - core parts of mamba are implemented in C++ for maximum efficiency # At the same time, mamba utilize the same command line parser, package installation and # deinstallation code and transaction verification routines as conda to stay as compatible as # possible. # conda install mamba -n base -c conda-forge -y # >>>> Returns no warnings / errors # Installs ipykernel in currently active Anaconda Environment mamba install ipykernel -y # >>>> Returns no warnings / errors # Installs cx_Oracle python -m pip install cx_Oracle --upgrade # >>>> Returns no warnings / errors # Binds ipykernel "cx_oracle_env" to Anaconda Environment "cx_oracle_env" python -m ipykernel install --user --name cx_oracle_env --display-name="cx_oracle_env" # >>>> Returns no warnings / errors
我从 [=19] 下载了 ORACLE InstantClient instantclient-basic-linux.x64-21.1.0.0.0.zip =] 到我的本地计算机,并将 zip 文件上传到我的 JupyterHub 工作目录。
我在启动器面板的笔记本部分选择“cx_oracle_env”打开了一个新的 Jupyter 笔记本。
在 Jupyter Notebook 中,我使用以下命令解压文件 instantclient-basic-linux.x64-21.1.0.0.0.zip:
from shutil import unpack_archive # Decompress ZIP-file to working directory (/home/jovyan/instantclient_21_1/) unpack_archive('instantclient-basic-linux.x64-21.1.0.0.0.zip', '') >>>> Returns no warnings / errors
检查路径是否存在:
import os.path from os import path path.exists("/home/jovyan/instantclient_21_1") # >>>> Returns True
设置LD_LIBRARY_PATH:
import os os.environ["LD_LIBRARY_PATH"] = "/home/jovyan/instantclient_21_1" !echo $LD_LIBRARY_PATH # >>>> Returns /home/jovyan/instantclient_21_1
设置ORACLE_HOME:
os.environ["ORACLE_HOME"] = "/home/jovyan/instantclient_21_1" !echo $ORACLE_HOME # >>>> Returns /home/jovyan/instantclient_21_1
安装 libaio:
!mamba install libaio -y # >>>> Returns no warnings / errors
导入cx_Oracle:
import cx_Oracle # >>>> Returns no warnings / errors
调用 init_oracle_client 后,出现以下错误:
cx_Oracle.init_oracle_client(lib_dir=r"/home/jovyan/instantclient_21_1")
我错过了什么?
PS:不幸的是,我在 JupyterHub 终端中没有 sudo 权限...
不幸的是,环境变量 LD_LIBRARY_PATH
必须 在开始该过程之前设置,因此在 Python 脚本中更改它是行不通的。
此外,由于即时客户端当前构建方式的限制,cx_Oracle.init_oracle_client()
不能在 Linux 上使用,除非事先在进程外设置 LD_LIBRARY_PATH
。希望这个限制很快就会被取消,但与此同时,这是你必须做的。您还可以使用 ld.so.conf
配置使安装适用于您的整个机器,在这种情况下不再需要设置 LD_LIBRARY_PATH
。
我最终解决了这个问题,方法是通过自定义 https://github.com/jupyter/docker-stacks/blob/master/minimal-notebook/Dockerfile 中的 Dockerfile 创建一个新的 JupyterHub 环境,并将其作为新的“最小 Oracle 环境”嵌入到 JupyterHub 中。
自定义Dockerfile有以下内容(我只添加了“cx_Oracle安装begin/end”部分):
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
ARG BASE_CONTAINER=jupyter/base-notebook
FROM $BASE_CONTAINER
LABEL maintainer="Jupyter Project <jupyter@googlegroups.com>"
USER root
# Install all OS dependencies for fully functional notebook server
RUN apt-get update && apt-get install -yq --no-install-recommends \
build-essential \
vim-tiny \
git \
inkscape \
libsm6 \
libxext-dev \
libxrender1 \
lmodern \
netcat \
# ---- nbconvert dependencies ----
texlive-xetex \
texlive-fonts-recommended \
texlive-plain-generic \
# ----
tzdata \
unzip \
nano-tiny \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# cx_Oracle installation begin
WORKDIR /opt/oracle
RUN apt-get update && apt-get install -y libaio1 wget
RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip && \
unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \
cd /opt/oracle/instantclient* && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci && \
echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
RUN python -m pip install cx_Oracle
WORKDIR $HOME
# cx_Oracle installation end
# Create alternative for nano -> nano-tiny
RUN update-alternatives --install /usr/bin/nano nano /bin/nano-tiny 10
# Switch back to jovyan to avoid accidental container runs as root
USER $NB_UID
在本地构建自定义Dockerfile,并作为“Minimal Oracle environment”嵌入到Kubernetes Cluster中后,在新建的JupyterHub环境中启动了一个新的Jupyter Notebook,测试ORACLE connect如下: