AlpineコンテナでNode.jsからgRPCを利用する場合、libc6-compatが必要

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のベースコンテナにはもはやおまじないのようにインストールしておいた方が良さそう。