therubyracerをAlpine linuxでも動くようにするDockerfileを書きました

  • 投稿日:
  • by
  • カテゴリ:

TL;DR

Alpine linux上では単純に$ gem install therubyracerしただけではtherubyracerは動かないのですが、これを動くようにするDockerfileを書きました。

DockerfileはDocker Hubのruby-with-therubyracerに置いてあり、usualoma/ruby-with-therubyracer:2.4.0-alpineという名前でbase imageとしても利用できるようになっています。(親のbase imageはruby:2.4.0-alpineです。)

何が必要だったか

therubyracerはlibv8というgemに依存しており、インストール時にlibv8に含まれるv8のライブラリにリンクされます。ここで、libv8は(ドキュメントにもあるのですが)通常だとコンパイル済みのバイナリで、Linuxの場合にはglibcにリンクされたものがインストールされるようになっているということのようです。そしてAlpine linuxではglibcではなくmusl libcがベースになっているという事情から、そのままでは動かないということでした。

そこまで分かれば後はlibv8をDockerfileでコンパイルすればよいだけなので既存のDockerfileを参考にしてlibv8をインストールして、その上でtherubyracerをインストールするようにしました。

docker image のサイズを抑えるためにやっていること

therubyracerではインストール時にlibv8のライブラリは静的にリンクされて利用時にはlibv8は参照されないようなので、libv8側のライブラリが含まれるディレクトリを$ rm -fr $(dirname $(dirname $(gem which libv8)))/vendorという形で削除しています。行儀のいいやり方ではありませんが、これだけで76MBほどかせぐことができます。

いずれにいしてもv8が入るのである程度大きくはなりますが、base imageから比較して55MB程度の増加で、debian8.0がベースのruby:2.4.0-slimで同じようにインストールしたものとと比較しても一応小ささは保たれているという感じです。