Dockerのmulti-stage buildでNodeの実行ファイルをコピーして使う

Nodeの実行ファイルをmulti-stage buildでCOPYして持って来て使ってみました。

CircleCIでHugoのビルド環境を整えている時に、go以外にもNodeも必要だったのでFROMをどれにしようと悩んでいたのですが、FROMをgoにして公式リポジトリのalpineでコンパイルされたNodeを持ってこれば良いんじゃないかと思い試してみました。

/usr/local/bin/node このバイナリファイルだけコピーしてきても共有ライブラリを使っていて↓のようなエラーが出てしまうので実行する側でもg++をインストールする必要があります。

Error loading shared library libstdc++.so.6: No such file or directory (needed by /usr/local/bin/node)
Error loading shared library libgcc_s.so.1: No such file or directory (needed by /usr/local/bin/node)
Error relocating /usr/local/bin/node: _ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode: symbol not found
Error relocating /usr/local/bin/node: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9push_backEc: symbol not found
Error relocating /usr/local/bin/node: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6resizeEmc: symbol not found
Error relocating /usr/local/bin/node: _ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base: symbol not found
Error relocating /usr/local/bin/node: _ZNSi10_M_extractIdEERSiRT_: symbol not found

その他にもnpmなども使いたいので、以下の様に設定したら動かすことができました。

FROM node:10.13.0-alpine AS node

FROM alpine:3.8
RUN apk add --no-cache --virtual g++

COPY --from=node /usr/local/bin/ /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules