2019年6月16日日曜日

DockerでNode.js + sqlite3の実行環境を作るときの注意

Node.jsで作ったウェブサービスをローカルで動かすためにDocker環境を構築していたときのこと。

サービスを実行したらこんなエラーが出ました。
Error: Please install sqlite3 package manually
いや、ちゃんとpackage.jsondependenciesに入ってるし。

というわけで、今日はこのお話です。

原因は?

原因を探るのにいろいろ苦労したのですが、このページにエラーメッセージで検索してたどり着いた人はとりあえず答えを教えろという気持ちでしょうから教えてあげます。

ホストとコンテナでNode.jsのバージョンが違っていたのが原因です。
もう少し詳しく書くと、
  • Node.jsのABIのバージョンnode_abiが違っている状態で
  • sqlite3モジュールを使って
  • ホスト側でnpm installした
場合に発生することがあります。多分、ホストOS(Windows/Linux/macOSとかディストロとか)によっても変わってくると思います。

もうちょっと詳しく

この問題が発生したとき、ホスト側のNode.jsのバージョンは10(ABIバージョン64)でした。
一方、コンテナ側のバージョンは8(ABIバージョン57)でした。

さて、この状態でホスト側でnpm installすると、以下のようなモジュールが作成されます。
node_modules/sqlite3/lib/binding/node-v64-linux-x64/node_sqlite3.node
しかし実際に実行する側(コンテナ側)では、ABIバージョン57に対応したモジュールがほしいので、
node_modules/sqlite3/lib/binding/node-v57-linux-x64/node_sqlite3.node
を一生懸命探します。
当然見つからないため、「sqlite3モジュールがないぞ!」と判断して最初のようなエラーを吐き出します。

対策

ちゃんとホストとコンテナでNode.jsのバージョンを合わせるか、コンテナ内でnpm installしましょう。

0 件のコメント:

コメントを投稿