繁体   English   中英

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

[英]dockerfile - NJS-045: cannot load the oracledb add-on binary for Node.js 10.16.0 (linux, x64)

我在公司防火墙后面,我有一个 node.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 throw new Error(nodbUtil.getErrorMessage('NJS-045', nodeInfo)); ^

错误:NJS-045:无法加载 Node.js 10.16.0 (linux, x64) 的 oracledb 附加二进制文件无法加载 /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安装 Instant Client Basic 或 Basic Light 包

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)

我究竟做错了什么?

PS 前 2 个命令是在我看到其他一些关于 SO 的帖子后添加的,这些帖子有一些类似的问题,但它不是与 docker 一起使用,而是通过 sudo 运行的。

请帮忙! 我从过去 10 天开始浏览其他帖子,现在我感到无助。 如果还需要其他任何东西,请告诉我。

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

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

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.jsonoracledb作为依赖项。 注意我什至不运行 ldconfig 因为 19.3 RPM Instant Client 已经这样做了。

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

更新:您可能对Node.js 和 Python 中的 Oracle 数据库应用程序的 Docker新博文感兴趣。

一些评论:

  • (i) 为什么使用如此旧的 Instant Client - 较新的将连接到 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM