Node.jsでgRPCを利用するアプリケーションを書いてるのだが、Alpine LinuxベースのDockerコンテナで運用する場合、ld-linux-x86-64.so.2
が無くて死ぬという備忘。
Error: Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /nodeapp/node_modules/grpc/src/node/extension_binary/grpc_node.node)
at Error (native)
at Object.Module._extensions..node (module.js:597:18)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/nodeapp/node_modules/grpc/src/node/src/grpc_extension.js:38:15)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/nodeapp/node_modules/grpc/src/node/src/client.js:55:12)
これはNodeのgRPCのモジュールに含まれる grpc_node.node
のバイナリで共有ライブラリとして ld-linux-x86-64.so.2
に依存していることに起因する。
イメージを軽くするため、基本的にAlpineのDockerイメージはスリム化されており、(https://github.com/nodejs/docker-node)も例外ではない。
解決策
Alpine3.3系以降であれば、apkで libc6-compat
をインストールすると解決できる。
RUN apk --update add libc6-compat
これを対象のイメージに仕込んでおく。gRPCの利用例もどんどん増えてきてるのでAlpineのベースコンテナにはもはやおまじないのようにインストールしておいた方が良さそう。