最近想用docker-N8N做消息的推送,但是数据库是Oracle,这可麻烦了,N8N原生是不支持Oracle节点的,于是乎开始探索怎么才能新增Oracle节点
- 首先需要新增N8N的Oracle节点,一通搜搜+问AI找到n8n-nodes-oracle库,可以直接NPM安装,安装后发现可以找到OracleSql节点,大喜!执行报错
libclntsh.so NOT FOUND
。发现需要客户端 - Oracle版本为11.2.0.1.0,下载客户端
instantclient-basic-linux.x64-11.2.0.4.0.zip
bash
设置环境变量地址
export LD_LIBRARY_PATH=/opt/oracle/instantclient:$LD_LIBRARY_PATH
export PATH=/opt/oracle/instantclient:$PATH
libclntsh.so的软连接
ln -s libclntsh.so.11.1 libclntsh.so
- 执行后继续报错
Error loading shared library libnsl.so.1
,执行ldd libclntsh.so
提示缺少libnsl.so.1
文件,尝试安装libnsl
。 - N8N基础为镜像
docker.n8n.io/n8nio/n8n
基于Alpine Linux,因此执行apk update && apk add libnsl
。再次查看libclntsh.so
的依赖发现仍然提示缺少libnsl.so.1
文件,怀疑是否安装libnsl
失败了于是查看安装情况发现是成功了的,只是版本变化了【望天。。。】
bash
/opt/oracle/instantclient # apk info -L libnsl
libnsl-2.0.1-r0 contains:
usr/lib/libnsl.so.3
usr/lib/libnsl.so.3.0.0
于是尝试直接执行软连接看看能否成功
bash
`ln -s /usr/lib/libnsl.so.3 /usr/lib/libnsl.so.1`
再次ldd,发现libnsl
的依赖问题没有了
typescript
/opt/oracle/instantclient # ldd libclntsh.so
/lib/ld-musl-x86_64.so.1 (0x7f90369db000)
libnnz11.so => /opt/oracle/instantclient/libnnz11.so (0x7f9033c9f000)
libdl.so.2 => /lib/ld-musl-x86_64.so.1 (0x7f90369db000)
libm.so.6 => /lib/ld-musl-x86_64.so.1 (0x7f90369db000)
libpthread.so.0 => /lib/ld-musl-x86_64.so.1 (0x7f90369db000)
libnsl.so.1 => /usr/lib/libnsl.so.1 (0x7f9033c97000)
libc.so.6 => /lib/ld-musl-x86_64.so.1 (0x7f90369db000)
libaio.so.1 => /usr/lib/libaio.so.1 (0x7f9033c92000)
libtirpc.so.3 => /usr/lib/libtirpc.so.3 (0x7f9033c67000)
libintl.so.8 => /usr/lib/libintl.so.8 (0x7f9033c55000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x7f9033c12000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x7f9033b64000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x7f9033b3b000)
libcom_err.so.2 => /usr/lib/libcom_err.so.2 (0x7f9033b35000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x7f9033b2a000)
libkeyutils.so.1 => /usr/lib/libkeyutils.so.1 (0x7f9033b24000)
Error relocating libclntsh.so: getcontext: symbol not found
Error relocating libclntsh.so: canonicalize_file_name: symbol not found
Error relocating libclntsh.so: __finite: symbol not found
但仍有一些报错,没有搞明白。尝试在N8N的Oracle节点执行sqlselect 1 from dual
得到结果1!至此终于正常了。所以上面的symbol not found
并不影响。
5.完整Dockerfile,如需其他版本客户端记得改下客户端zip
bash
FROM docker.n8n.io/n8nio/n8n
USER root
RUN npm_config_user=root npm install -g n8n-nodes-oracle
ENV N8N_CUSTOM_EXTENSIONS "/usr/local/lib/node_modules/n8n-nodes-oracle"
RUN apk add --no-cache libaio wget unzip libnsl
COPY instantclient-basic-linux.x64-11.2.0.4.0.zip /tmp/
RUN cd /tmp && \
unzip instantclient-basic-linux.x64-11.2.0.4.0.zip && \
mkdir -p /opt/oracle && \
mv instantclient_* /opt/oracle/instantclient && \
rm -rf /tmp/instantclient-basic-linux.x64-11.2.0.4.0.zip
# 链接libclntsh.so
RUN ln -s /opt/oracle/instantclient/libclntsh.so.11.1 /opt/oracle/instantclient/libclntsh.so
# 链接libnsl.so.1
RUN ln -s /usr/lib/libnsl.so.3 /usr/lib/libnsl.so.1
ENV LD_LIBRARY_PATH=/opt/oracle/instantclient:$LD_LIBRARY_PATH
ENV PATH=/opt/oracle/instantclient:$PATH
ENV TNS_ADMIN=/opt/oracle/instantclient/network/admin
RUN rm -rf /var/cache/apk/*