如何用Docker连接Apache Superset与Oracle并解决DPI-1047错误
解决Docker中Apache Superset连接Oracle的DPI-1047错误
核心原因
DPI-1047错误是因为cx_Oracle依赖的64位Oracle客户端库未安装,或未被系统正确识别。
步骤1:构建包含Oracle客户端的Superset镜像(推荐持久化方案)
创建自定义Dockerfile,在官方Superset镜像基础上集成Oracle客户端和cx_Oracle:
# 基于官方Superset镜像 FROM apache/superset:latest # 切换到root用户执行系统级操作 USER root # 安装依赖工具(适配Debian/Ubuntu系镜像) RUN apt-get update && apt-get install -y --no-install-recommends \ unzip \ libaio1 \ curl \ && rm -rf /var/lib/apt/lists/* # 创建Oracle客户端目录并下载解压Instant Client Basic包 RUN mkdir -p /opt/oracle \ && cd /opt/oracle \ # 下载21c版本客户端(可根据Oracle服务器版本调整为19c/18c等) && curl -O https://download.oracle.com/otn_software/linux/instantclient/2113000/instantclient-basic-linux.x64-21.13.0.0.0.zip \ && unzip instantclient-basic-linux.x64-21.13.0.0.0.zip \ && rm instantclient-basic-linux.x64-21.13.0.0.0.zip # 配置环境变量,确保系统能找到Oracle客户端库 ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_21_13:$LD_LIBRARY_PATH ENV ORACLE_HOME=/opt/oracle/instantclient_21_13 # 切换回superset用户,安装cx_Oracle USER superset RUN pip install --no-cache-dir cx_Oracle --upgrade
构建并运行镜像
# 构建自定义镜像 docker build -t superset-oracle . # 启动容器(可按需添加端口映射、目录挂载等参数) docker run -d -p 8088:8088 superset-oracle
步骤2:在现有Superset容器中手动修复(临时方案)
若不想重新构建镜像,可直接进入运行中的容器操作:
- 进入容器并切换到root用户
docker exec -it <你的Superset容器ID> bash su - root
- 安装依赖和Oracle客户端
# 安装基础工具 apt-get update && apt-get install -y unzip libaio1 curl # 创建目录并下载解压客户端 mkdir -p /opt/oracle && cd /opt/oracle curl -O https://download.oracle.com/otn_software/linux/instantclient/2113000/instantclient-basic-linux.x64-21.13.0.0.0.zip unzip instantclient-basic-linux.x64-21.13.0.0.0.zip rm instantclient-basic-linux.x64-21.13.0.0.0.zip
- 配置环境变量并安装cx_Oracle
# 临时生效(容器重启后失效) export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_13:$LD_LIBRARY_PATH # 永久生效(写入superset用户的bash配置) echo 'export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_13:$LD_LIBRARY_PATH' >> /home/superset/.bashrc # 切换回superset用户,更新cx_Oracle su - superset pip install cx_Oracle --upgrade
步骤3:验证Oracle连接
在容器中执行以下代码,确认连接正常:
import cx_Oracle # 可选:手动指定客户端库目录,避免环境变量失效问题 cx_Oracle.init_oracle_client(lib_dir='/opt/oracle/instantclient_21_13') try: # 替换为你的Oracle连接信息 conn = cx_Oracle.connect( user='admin', password='12345678', dsn=cx_Oracle.makedsn( 'database-1.pppppppppp.oo-kailsam-0.rds.amazonaws.com', 1521, service_name='DATABASE' ) ) cursor = conn.cursor() cursor.execute('SELECT * FROM DUAL') print('连接成功,测试结果:', cursor.fetchone()) cursor.close() conn.close() except cx_Oracle.Error as e: print('连接失败:', e)
步骤4:在Superset中配置Oracle数据源
- 登录Superset Web界面(默认端口8088)
- 进入Data > Databases,点击**+ Database**
- 在数据源类型中选择Oracle
- 填写SQLAlchemy连接URI:
oracle+cx_oracle://admin:12345678@database-1.pppppppppp.oo-kailsam-0.rds.amazonaws.com:1521/?service_name=DATABASE注意:若使用SID而非Service Name,URI格式为:
oracle+cx_oracle://admin:12345678@database-1.pppppppppp.oo-kailsam-0.rds.amazonaws.com:1521/DATABASE - 点击Test Connection验证通过后,保存配置即可。
内容的提问来源于stack exchange,提问作者Narender Parikapalli
相关产品推荐
相关产品推荐

