linux上的Node-oracledb无效的ELF标头

Posted

技术标签:

【中文标题】linux上的Node-oracledb无效的ELF标头【英文标题】:Node-oracledb invalid ELF header on linux 【发布时间】:2018-11-29 18:08:10 【问题描述】:

我将 node-oracledb(基于 docker-node-oracle)的 dockerized 设置与 Node 10 一起使用,但是当我启动容器时,此错误不断弹出:

backend_1  | /app/node_modules/oracledb/lib/oracledb.js:68
backend_1  |       throw new Error(nodbUtil.getErrorMessage('NJS-045', nodeInfo));
backend_1  |       ^
backend_1  |
backend_1  | Error: NJS-045: cannot load the oracledb add-on binary for Node.js 10.4.1 (linux, x64)
backend_1  | Cannot load /app/node_modules/oracledb/build/Release/oracledb.node
backend_1  | /app/node_modules/oracledb/build/Release/oracledb.node: invalid ELF header
backend_1  | Node-oracledb installation instructions: https://oracle.github.io/node-oracledb/INSTALL.html
backend_1  | You must have 64-bit Oracle client libraries in LD_LIBRARY_PATH, or configured with ldconfig.
backend_1  | If you do not have Oracle Database on this computer, then install the Instant Client Basic or Basic Light package from
backend_1  | http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
backend_1  |
backend_1  |     at Object.<anonymous> (/app/node_modules/oracledb/lib/oracledb.js:68:13)
backend_1  |     at Module._compile (internal/modules/cjs/loader.js:702:30)
backend_1  |     at Module._extensions..js (internal/modules/cjs/loader.js:713:10)
backend_1  |     at Object.require.extensions.(anonymous function) [as .js] (/app/node_modules/babel-register/lib/node.js:152:7)
backend_1  |     at Module.load (internal/modules/cjs/loader.js:612:32)
backend_1  |     at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
backend_1  |     at Function.Module._load (internal/modules/cjs/loader.js:543:3)
backend_1  |     at Module.require (internal/modules/cjs/loader.js:650:17)
backend_1  |     at require (internal/modules/cjs/helpers.js:20:18)
backend_1  |     at Object.<anonymous> (/app/node_modules/oracledb/index.js:1:18)

我已尝试使用不同的节点版本(8 和 9),但不断弹出相同的错误,这表明我的图像设置可能存在问题,但我无法弄清楚是什么。这是dockerfile:

# INSTALL UBUNTU
FROM node:10

#INSTALL LIBAIO1 & UNZIP (NEEDED FOR STRONG-ORACLE)
RUN apt-get update \
    && apt-get install -y libaio1 \
    && apt-get install -y build-essential \
    && apt-get install -y unzip \
    && apt-get install -y curl

#ADD ORACLE INSTANT CLIENT
RUN mkdir -p opt/oracle
ADD ./oracle/linux/ .

# 12.2
RUN unzip instantclient-basic-linux.x64-12.2.0.1.0 -d /opt/oracle \
    && mv /opt/oracle/instantclient_12_2 /opt/oracle/instantclient

RUN cd /opt/oracle/instantclient \
    && ln -s libclntsh.so.12.1 libclntsh.so \
    && ln -s libocci.so.12.1 libocci.so 

RUN echo /opt/oracle/instantclient > /etc/ld.so.conf.d/oracle-instantclient.conf

ENV LD_LIBRARY_PATH="/opt/oracle/instantclient"

WORKDIR app

ARG NODE_ENV
ENV NODE_ENV $NODE_ENV

COPY package.json .

RUN npm install

COPY . .
RUN ./build.sh

CMD [ "./up.sh" ]

有谁知道/遇到过 node-oracledb 的这个问题?

【问题讨论】:

容器中的实际操作系统是什么?预构建的 node-oracledb 二进制文件是在 Oracle Linux 6(与 RHEL 6 相同)上构建的。 FWIW 我的 Docker 示例使用 OL7:blogs.oracle.com/opal/a-node-oracledb-web-service-in-docker Dockerfile 有 FROM node:10 所以我认为是 Ubuntu。 正在github.com/oracle/node-oracledb/issues/939讨论这个问题的交叉帖子 【参考方案1】:

在克里斯托弗在上述帖子中的帮助下,我得到了它的工作。连同他的 Dockerfile 和一个干净的石板(删除所有 Docker 映像/容器,重新启动 pc,...)我让它工作了。谢谢帮忙!

【讨论】:

【参考方案2】:

您需要将node_modules 添加到 .dockerignore 然后将其删除 node_modules

【讨论】:

最近的 node-oracledb 版本安装了所有预构建的二进制模块,因此更容易将 node_modules 从一个平台移动到另一个平台,因为将在运行时加载正确的二进制文件(如果适用于操作系统架构)

以上是关于linux上的Node-oracledb无效的ELF标头的主要内容,如果未能解决你的问题,请参考以下文章

执行存储过程 NJS-012 时出现 node-oracledb 错误

npm install node-oracledb 失败

一个查询中的 node-oracledb 多个语句

更新查询在node-oracledb模块中挂起

使用带有 node-oracledb 的 SID 连接到 Oracle DB 失败

ORA-00904: 相关子查询上的列名无效