繁体   English   中英

JupyterHub Oracle InstantClient 和 cx_Oracle 安装

[英]JupyterHub Oracle InstantClient and cx_Oracle installation

我使用 Docker 容器安装了 JupyterHub。

  1. 我创建了一个新的 Anaconda 环境“cx_oracle_env”,并在终端中安装了 package 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
  2. I downloaded the ORACLE InstantClient instantclient-basic-linux.x64-21.1.0.0.0.zip from https://www.oracle.com/uk/database/technologies/instant-client/linux-x86-64-downloads.html到我的本地计算机,并将 zip 文件上传到我的 JupyterHub 工作目录。

  3. 我通过在 Launcher 面板的 Notebook 部分中选择“cx_oracle_env”打开了一个新的 Jupyter Notebook。

  4. 在 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
  5. 检查路径是否存在:

     import os.path from os import path path.exists("/home/jovyan/instantclient_21_1") # >>>> Returns True
  6. 设置 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
  7. 设置 ORACLE_HOME:

     os.environ["ORACLE_HOME"] = "/home/jovyan/instantclient_21_1" !echo $ORACLE_HOME # >>>> Returns /home/jovyan/instantclient_21_1
  8. 安装 libaio:

     !mamba install libaio -y # >>>> Returns no warnings / errors
  9. 导入 cx_Oracle:

     import cx_Oracle # >>>> Returns no warnings / errors
  10. 调用 init_oracle_client 后,出现以下错误:

     cx_Oracle.init_oracle_client(lib_dir=r"/home/jovyan/instantclient_21_1")

在此处输入图像描述

我错过了什么?

PS:不幸的是,我在 JupyterHub 终端中没有 sudo 权限... 在此处输入图像描述

不幸的是,环境变量LD_LIBRARY_PATH必须在启动进程之前设置,因此在 Python 脚本中更改它是行不通的。

此外,由于当前构建即时客户端的方式受到限制,如果没有事先在进程之外设置LD_LIBRARY_PATH ,则无法在 Linux 上使用cx_Oracle.init_oracle_client() 希望这个限制很快就会被取消,但与此同时,这就是你必须做的。 您还可以使用ld.so.conf配置使安装适用于您的整个机器,在这种情况下,不再需要设置LD_LIBRARY_PATH

I solved the problem finally by creating a new JupyterHub environment by customizing the Dockerfile from https://github.com/jupyter/docker-stacks/blob/master/minimal-notebook/Dockerfile , and embedded it as new "Minimal Oracle environment"在 JupyterHub 中。

自定义 Dockerfile 有以下内容(我只添加了“cx_Oracle 安装开始/结束”部分):

# 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

After building the custom Dockerfile locally, and embedding it into the Kubernetes Cluster as "Minimal Oracle environment", I started a new Jupyter Notebook in the newly created JupyterHub environment, and tested the ORACLE connect as follows:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM