久しぶりに Wercker で新しいRailsアプリのビルドを実行してみたら、ビルドが途中でこける問題が発生
こんなエラーがでて死んでた
/cache/bundle-install/ruby/2.2.0/gems/execjs-2.5.2/lib/execjs/runtimes.rb:48:in `autodetect': Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
このエラーを見ると、execjs
, Could not find a JavaScript runtime
という
以前ハマった v8
周り、つまり therubyracery
いれるだのいれないだのの問題を思い出した。
ここで execjs
, therubyracery
を Gemfile に入れると動くのかもしれないけれど(試してないけど)、
ローカルや、他のアプリがこれなしで本番環境で問題無く動くのに、Werckerのために入れてしまうのは本末転倒な気がするので、
別の解決方法を模索する。
以前も別の記事で書いた気がするけど、このエラーってexecjs がJavaScriptランタイムを見つけられなくて発生するので、 そもそもOS上にJSの実行環境がないんでしょう。つまり Linux だから Node.js 辺りが入っていればいいものが、入っていないはず。
どうもいろいろ見ていると、いろんなサイトで書かれている box: rvm
というのはもともと Wercker 自体がホストしてたイメージっぽいね。
https://app.wercker.com/#applications/52c6d6e1728cc898720001e3/tab/details
で、今は Wercker ではなく、dockerhub
からイメージを取得してくるように変わったらしい。
それで今回、Wercker が初期に自動生成してくれた wercker.yml
には box: ruby
と書かれていたのか。
元々のアプリがJavaScript周りでこけなかったのは、
先ほどの rvm
イメージのページの下の方に載っているけど、このイメージが nodejs
なんかも含めているからで、
dockerhub
の ruby
イメージは、純粋に Ruby のイメージとなっている。
そりゃ Runtime が見つからないわけだ。
といことで、
- ruby 2.2.2
- node.js
を含むイメージを探してみる。
ruby がちょっと新しすぎるみたいで、2.2.1 までのやつが多かった。
で、mwallasch/docker-ruby-node
なら要件にマッチしそう。
README的なところには 2.2.1 って書かれてるけど、dockerfile を見ると 2.2.2 と書かれているし、
実際に Wercker の step で echo させてみると、 2.2.2-p95 が返ってきた。
そして、無事 execjs 部分も通過、ビルドも通ったとさ。