【发布时间】:2018-02-16 05:19:54
【问题描述】:
我们的目标是将我们的 node.js 网络服务集成到 cloudfoundry 中。由于我们需要 oracledb 模块来访问我们的数据库,因此我们不得不创建一个自定义 buildpack(从 cloudfoundry/nodejs-buildpack 分叉),它会安装所需的 oracle 即时客户端。
在s.Stager.BuildDir() + '/instantclient-basic' 目录中下载并解压缩instantclient 和sdk 后,似乎我们必须将LD_LIBRARY_PATH 变量设置为这个路径。
因此,在/src/nodejs/supply/supply.go 文件中,我们添加了以下代码行:
if err := s.Stager.WriteEnvFile("LD_LIBRARY_PATH", filepath.Join(s.Stager.BuildDir(), "instantclient-basic")); err != nil {
return err
}
但是,在安装此 buildpack 时的日志输出中,它列出了其他变量,如 NODE_ENV 或 NODE_HOME(设置方式完全相同)我的变量 LD_LIBRARY_PATH 丢失。如何正确导出新的环境变量?
---- 编辑以回应 Daniel Mikusa 的回答 ---
我尝试遵循.profile 包括即时客户端文件方法:
- controllers
- public
- instantclient
| --- libclntsh.so
| ...
app.js
server.js
package.json
.profile
.profile 文件如下所示:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/app/instantclient
不过,当我从中创建一个 .zip 并在我们的 cloundfoundry 上暂存一个新的 nodejs buildpack 时,我得到了与以前相同的错误:
ERR 错误:NJS-045:无法为 Node.js 6.11.2(linux,64)加载 oracledb 附加二进制文件
ERR Node.js require() 错误是:
ERR DPI-1047:无法加载 64 位 Oracle 客户端库:“libclntsh.so:无法打开共享对象文件:没有这样的文件或目录”。
你发现这里有什么错误吗?
【问题讨论】:
-
如果这是一个 Linux VM 并且唯一的 Oracle 软件是 Instant Client,那么请按照 Instant Client 安装说明中的说明使用 ldconfig:oracle.com/technetwork/topics/… 这样可以避免必须在每个 shell 中设置 LD_LIBRARY_PATH正在调用 Node.js。
-
我尝试写入文件
/etc/ld.so.conf.d/oracle-instantclient.conf,但是,访问被拒绝,sudo 似乎也不可能。
标签: cloud-foundry