89913


LOLIPOP!マネージドクラウドのNode.js用コンテナにデプロイしたアプリからnode-
oracledbでリモートのOracleDBに接続しようとしているのですが下記エラーが発生してしまい接続できません。

[code]

    Error: DPI-1047: Cannot locate a 64-bit Oracle Client library:
    "libnnz21.so: cannot open shared object file: No such file or
    directory". See https://oracle.github.io/node-oracledb/INSTALL.html
    for help   Node-oracledb installation instructions:
    https://oracle.github.io/node-oracledb/INSTALL.html   You must have
    64-bit Oracle Client libraries configured with ldconfig, or in
    LD_LIBRARY_PATH.   If you do not have Oracle Database on this
    computer, then install the Instant Client Basic or Basic Light package
    from   
    https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
    
[/code]

root権限が与えられていないため、OracleInstantをホームディレクトリ配下にwgetコマンドで上記にも記載されているページからZIP版をダウンロード・解凍してインストールしました。(Basic・Lightどちらも試しています)

環境変数 `LD_LIBRARY_PATH` には上記のパスである `/var/app/shared/oracle/instantclient_21_6`
をLOLIPOPの管理画面から登録済みで `PATH` にも同パスを追記しています。  
なお、`ORACLE_HOME` は設定していません。

実際のDB接続処理は下記の通りです(initOracleClient()でエラー)

[code]

    Logger.info(`LD_LIBRARY_PATH=${process.env.LD_LIBRARY_PATH}`);
    Logger.info(`PATH=${process.env.PATH}`);
    Logger.info(`ORACLE_LIB_DIR=${config.oracleLibDir}`);
    oracledb.initOracleClient({ libDir: config.oracleLibDir });
    
    [2022-07-10T14:54:16.739] [INFO] system - LD_LIBRARY_PATH=/var/app/shared/oracle/instantclient_21_6
    [2022-07-10T14:54:16.739] [INFO] system - PATH=/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/var/app/1657432410488792/node_modules/.bin:/var/app/1657432410488792/node_modules/.bin:/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/var/app/1657432410488792/node_modules/.bin:/var/app/shared/oracle/instantclient_21_6:/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/var/app/1657213958461238/node_modules/.bin:/var/app/.npm/_npx/14/bin:/var/app/1657213958461238/node_modules/.bin:/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/var/app/1657213958461238/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    [2022-07-10T14:54:16.739] [INFO] system - ORACLE_LIB_DIR=/var/app/shared/oracle/instantclient_21_6
    
[/code]

エラーメッセージ的にはパスが通っていないような気もするのですが、そもそも非rootでは動作しないものなのでしょうか？  
ちなみに手元にあるWindows環境では同様のアプリとWindows版OracleInstantでDBに接続できることを確認しています。  
Linux系はほとんど知識がないため困っています。何卒よろしくお願いいたします。

Ubuntu 16.04.7 LTS  
node-oracledb ver.5.3.0  
OracleInstant(instantclient_21_6)

\---追記---  
<https://oracle.github.io/node-oracledb/INSTALL.html#instzip>より、

> You will need the operating system libaio package installed. On some  
>  platforms the package is called libaio1.

とのことなので当該パッケージを手動でダウンロードして下記コマンドでインストールしてみましたがエラー内容含めて変わらずでした。  
`dpkg -x libaio1_0.3.112-13build1_amd64.deb
/var/app/shared/oracle/instantclient_21_6/libaio`


CC BY-SA 4.0
2022-07-08T20:18:30.987
89848
2022-07-11T11:56:20.100
2022-07-10T11:00:50.857
53446
53446
question
linux node.js ubuntu oracle
LOLIPOP!マネージドクラウド環境でのOracleInstant導入


自己解決しました。  
結論から言うとLOLIPOP!マネージドクラウド環境でのnode-oracledbによるDB接続は難しそうです。

まずはじめに、node-
oracledbはアプリ側で環境変数を設定することもできるとしながらも、`LD_LIBRARY_PATH`は例外的にNode.js起動前に設定されている必要がある?ようです  
<https://oracle.github.io/node-oracledb/doc/api.html#-154-oracle-environment-
variables>

> It is recommended to set Oracle variables in the environment before  
>  invoking Node.js, however they may also be set in application code as  
>  long as they are set before node-oracledb is first used. System  
>  environment variables like LD_LIBRARY_PATH must be set before Node.js  
>  starts.

件の環境ではアプリ側envファイルで`LD_LIBRARY_PATH`を設定してしまっていたため、DB接続処理時にエラーとなっているようです。  
そのため、LOLIPOP管理画面より環境変数`LD_LIBRARY_PATH`を設定しようとしましたが登録時にエラーとなりました。  
これをLOLIPOPに問い合わせた結果、`LD_XXXXX`という変数名の一部はセキュリティの都合で設定できない仕様であるとのことでした。

node-
oracledbによるDB接続は諦めてOracleCloudのRESTfulServiceでHTTPリクエストによるDBアクセスを検討してみようと思います・・・


CC BY-SA 4.0
2022-07-11T11:56:20.100
89913
2022-07-11T11:56:20.100
53446
89848
answer