青龙面板连接Oracle数据库
2023-04-12

source /etc/profile该命令只在当前会话生效,因此将其加入到全局中

  1. sudo vi ~/.bashrc
  2. 添加命令 source /etc/profile
  3. 重启qinglong docker容器后即可生效

---------------------2023-04-12更新--------------------------------------------------

  1. 公司需要定时任务来做各种各样的提醒,考虑通过简单的脚本实现发送提醒的需求。
  2. 发现青龙面板很合适做简单定时任务的管理,因此希望通过青龙面板python连接Oracle查出相关信息并发送
  3. 遇到的坑:
    1. 无法安装cx_Oracle,需要升级pip
pip install --upgrade pip
    1. 升级后无法安装cx_Oracle,缺少gcc等包:安装gcc和musl-dev
apk add --no-cache gcc musl-dev
    1. 安装Oracle:这里参考了CSDN博主丧心病狂博的帖子,其中在处理第二条报错时候库libnsl.so.2.0.0已升级为libnsl.so.3.0.0,需修改下版本。
  1. 自此容器中可以实现python连接Oracle但在青龙面板中还是会报错,输出环境变量发现存在差异因此参照帖子所说在青龙面板配置文件-task_before.sh中执行:
source /etc/profile

后一切正常,自此可以正常的连接Oracle数据库了

附:帖子存档
Docker Alpine安装oracle客户端

进入docker容器
docker run -it --name=容器名 镜像名:latest /bin/sh 由镜像创建容器并进入(只有镜像无容器)

docker exec -it 容器名 /bin/sh 直接进入运行中的容器
安装必要包

apk add libaio, libnsl, unzip

下载解压oracle basic包
需要对应服务器版本, 命令select * from v$version;

各版本下载地址(32位): https://www.oracle.com/database/technologies/instant-client/linux-x86-32-downloads.html

各版本下载地址(64位): https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

下载basic免安装zip包, 需要登录验证, 所以下载链接不能复用, 要在上面链接中找对应版本下载

弄个单独目录存

cd /usr/local
mkdir oracle
cd oracle

wget -c 支持断点续传

wget -c https://download.oracle.com/otn/linux/instantclient/11204/instantclient-basic-linux.x64-11.2.0.4.0.zip
?AuthParam=1644827926_6725c450378f19288cb3dc5d040b8a18

unzip 解压

unzip instantclient-basic-linux.x64-11.2.0.4.0.zip?AuthParam\=1644827926_6725c450378f19288cb3dc5d040b8a18

整理下文件

mv ./instantclient_11_2/* ./
rmdir instantclient_11_2

unzip End-of-central-directory signature not found: 多半是下载的文件有问题, 重新下载就可以

添加环境变量

通过查看 /etc/profile 可以看到会加载 /etc/profile.d/目录下的 .sh结尾的文件

弄个单独的环境变量配置文件

vi /etc/profile.d/oracle.sh

export ORACLE_HOME=/usr/local/oracle
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH

测试下加上没有

source /etc/profile
echo $PATH

退出容器

exit

注: 这里会有很多奇怪的报错, 以下为作者碰到的

报错1. Error loading shared library /usr/local/oracle/lib/libclntsh.so: No such file or directory

(一开始是打算用软链接的, 但是没用, 直接复制就可以了, 不知道为什么)

mkdir /usr/local/oracle/lib
cp /usr/local/oracle/libclntsh.so.11.1 /usr/local/oracle/lib/libclntsh.so

报错2.
Error loading shared library libnsl.so.1: No such file or directory (needed by /usr/local/oracle/lib/libclntsh.so
(libnsl.so.1 或 libnsl.so) 建对应软链接

ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so.1
ln -s /usr/lib/libnsl.so.2.0.0 /usr/lib/libnsl.so

提交镜像
docker commit -a ‘laowang’ 容器名 镜像名:1.0.0
1
换docker启动用的镜像版本号
注: 最后会发现环境变量没有加载, 原因未知

绕路解决方法:

通过DockerFile直接运行容器的项目: 修改Dockerfile文件, 例: CMD source /etc/profile && gunicorn …
通过DockerCompose启动的项目: 修改docker-compose.yml文件 例: command: /bin/sh -c “source /etc/profile && gunicorn …”

python 直连测试代码

import cx_Oracle
conn = cx_Oracle.connect(“user/passwd@host/instance”)