You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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容器中手动修复(临时方案)

若不想重新构建镜像,可直接进入运行中的容器操作:

  1. 进入容器并切换到root用户
docker exec -it <你的Superset容器ID> bash
su - root
  1. 安装依赖和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
  1. 配置环境变量并安装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数据源

  1. 登录Superset Web界面(默认端口8088)
  2. 进入Data > Databases,点击**+ Database**
  3. 在数据源类型中选择Oracle
  4. 填写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

  5. 点击Test Connection验证通过后,保存配置即可。

内容的提问来源于stack exchange,提问作者Narender Parikapalli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:57:50