NJS-045:无法加载 Node.js 10.16.0(linux,x64)的 oracledb 附加二进制文件



我在企业防火墙后面,我有一个节点.js应用程序可以通过docker映像部署到Openshift容器上。该应用程序需要在服务器上配置oracledb附加二进制文件 - Oracle InstantClient软件包。

我有以下 Dockerfile:

FROM devops-automation-docker<....>/rhel7-nodejs-10:latest
RUN mkdir -p /opt/oracle
# set working directory
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY . .
RUN mv instantclient_11_2 /opt/oracle
ENV LD_LIBRARY_PATH /opt/oracle/instantclient_11_2
RUN sh -c "echo /opt/oracle/instantclient_11_2 > /etc/ld.so.conf.d/oracle-instantclient.conf" && 
    ldconfig &&  
    echo ${LD_LIBRARY_PATH} && 
    npm ci 

EXPOSE 3002
CMD ["node", "server.js"]

构建成功,但是当我部署和运行时,它抛出以下错误:

/

usr/src/app/design-pattern-exemplars/node_modules/oracledb/lib/oracledb.js:68 抛出新的错误(nodbUtil.getErrorMessage('NJS-045', nodeInfo((; ^

错误:NJS-045:无法加载节点的 oracledb 附加二进制文件.js 10.16.0 (linux, x64( 无法加载/usr/src/app/design-pattern-exemplars/node_modules/oracledb/build/Release/oracledb.node/usr/src/app/design-pattern-exemplars/node_modules/oracledb/build/Release/oracledb.node: 无效的 ELF 标头 Node-oracledb 安装说明: https://oracle.github.io/node-oracledb/INSTALL.html 你必须有 LD_LIBRARY_PATH 中的 64 位 Oracle 客户端库,或配置 ldconfig.如果此计算机上没有 Oracle 数据库,则 从以下位置安装即时客户端基本或基本轻量级软件包 http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

at Object.<anonymous> (/usr/src/app/design-pattern-exemplars/node_modules/oracledb/lib/oracledb.js:68:13)
at Module._compile (internal/modules/cjs/loader.js:776:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Module.require (internal/modules/cjs/loader.js:690:17)
at require (internal/modules/cjs/helpers.js:25:18)
at Object.<anonymous> (/usr/src/app/design-pattern-exemplars/node_modules/oracledb/index.js:1:18)
at Module._compile (internal/modules/cjs/loader.js:776:30)

我做错了什么?

附言前 2 个命令是在我在 SO 上看到其他一些帖子后添加的,这些帖子有一些类似的问题,但它不是 docker 的,而是通过 sudo 运行的。

请帮忙!自过去 10 天以来,我浏览了其他帖子,现在我感到无助。如果还需要什么,请告诉我。

乍一猜测,您正在从不同的主机体系结构复制 node-oracledb 安装。 由于node-oracledb具有二进制组件,这可能会导致问题。 但话虽如此,可以在预提供的二进制文件可用的操作系统之间复制较新的 node-oracledb 版本。 您的 node-oracledb 版本是什么? 最新的是 4.0。 您是否将node-oracledb作为package.json中的依赖项?

我的建议:首先在 Dockerfile 中进行安装,https://blogs.oracle.com/opal/dockerfiles-for-node-oracledb-are-easy-and-simple:

FROM oraclelinux:7-slim
RUN  yum -y install oracle-release-el7 oracle-nodejs-release-el7 && 
     yum-config-manager --disable ol7_developer_EPEL && 
     yum -y install oracle-instantclient19.3-basiclite nodejs && 
     rm -rf /var/cache/yum
WORKDIR /myapp
ADD package.json /myapp/
ADD index.js /myapp/
RUN npm install
CMD exec node index.js

我的package.json oracledb是一种依赖关系。 请注意,我什至没有运行ldconfig,因为19.3 RPM即时客户端已经这样做了。

如果事实证明您的 docker 容器架构没有二进制文件,则必须从源代码编译,再次在 Dockerfile 中编译。

更新:您可能对新的博客文章 Docker for Oracle Database Applications in Node.js and Python 感兴趣。

一些评论:

  • (i( 为什么要使用这么旧的即时客户端 - 较新的客户端将连接到 11.2 DB 或更高版本。 您的数据库版本是什么?
  • (ii( 如果您已经运行了 ldconfig,则无需设置LD_LIBRARY_PATH。
  • (iii(当我在防火墙后面时,我会在我的Dockerfile中添加这样的东西:ENV https_proxy=http://example.com:80和/或RUN npm config set proxy http://example.com:80

最新更新