使用Airflow厚模式连接Oracle 19C失败,求助解决DPI-1047错误
解决Airflow厚模式连接Oracle 19C的DPI-1047错误及容器问题
问题根源
DPI-1047错误是因为Airflow容器内未安装Oracle Instant Client库,单独构建的Oracle客户端容器未被Airflow容器调用,无法提供所需的连接依赖。
解决方案
1. 构建整合Oracle客户端的Airflow自定义镜像
不要单独维护Oracle客户端镜像,直接将Oracle Instant Client整合到Airflow镜像中:
- 先手动下载Oracle Instant Client 19c的basic rpm包(对应Oracle Linux 8版本),放到Dockerfile同目录下。
- 创建如下Dockerfile:
FROM apache/airflow:2.7.2 # 安装Oracle客户端依赖的系统库 RUN yum install -y libaio && \ yum clean all # 复制并安装本地的Oracle Instant Client rpm COPY oracle-instantclient-basic-19.20.0.0.0-1.el8.x86_64.rpm /tmp/ RUN rpm -ivh /tmp/oracle-instantclient-basic-19.20.0.0.0-1.el8.x86_64.rpm && \ rm -f /tmp/oracle-instantclient-basic-19.20.0.0.0-1.el8.x86_64.rpm # 设置Oracle环境变量,确保Airflow能找到客户端库 ENV LD_LIBRARY_PATH=/usr/lib/oracle/19.20/client64/lib:$LD_LIBRARY_PATH ENV ORACLE_HOME=/usr/lib/oracle/19.20/client64 # 安装所需的Airflow providers RUN pip install --no-cache-dir apache-airflow-providers-oracle==3.7.4 RUN pip install --no-cache-dir apache-airflow-providers-postgres==5.6.1
- 构建镜像:
docker build . --tag airflow-oracle:2.7.2
2. 修改docker-compose.yaml使用自定义镜像
打开下载的docker-compose.yaml,将所有服务(webserver、scheduler、worker、triggerer等)的image字段从apache/airflow:2.7.2替换为自定义镜像airflow-oracle:2.7.2,无需保留单独的Oracle客户端容器配置。
3. 重新初始化并启动Airflow
- 清理旧的容器和数据:
docker compose down -v
- 初始化Airflow:
docker compose up airflow-init
- 启动Airflow服务:
docker compose up -d
4. 验证连接
在Airflow UI中创建Oracle连接并测试。若仍有问题,进入Airflow worker容器检查库文件:
docker exec -it <你的airflow-worker容器ID> ls /usr/lib/oracle/19.20/client64/lib/
确认libclntsh.so存在即可。
5. Astro启动问题修复
修改Astro的Dockerfile为上述整合Oracle客户端的配置,重新构建镜像后再启动Astro服务。
内容的提问来源于stack exchange,提问作者Ramkumar.S
相关产品推荐
相关产品推荐

