あるRailsアプリケーションを8年ぶりに動かそうとしています。
実行環境は、WSL上の Ubuntu 22.04 です。動かせるでしょうか?
8年前は2016年、Rails 5.0 がリリースされた年です。
残念ながら、このアプリケーションのRailsのバージョンは5.0
ではなく、4.2
でした。
Rails 4.2 がサポートしているRubyのバージョンは2.2
です。
問題
Ubuntu 22.04 では Ruby 2.2 が動きません。正確には gem install
できません。
実行すると次のエラーが出ます。
►gem install bundler
ERROR: While executing gem ... (RuntimeError)
Marshal.load reentered at marshal_load
実行したときに、このエラーが出ずにsegmentation faultすることもあります。
Ruby 2.2にはbundler
が含まれません。
gem install
できないとbundle install
もできず、ここから先に進むことはできません。
対応方法
これは既知のissueです。
に、対応方法がいくつか書かれています。
- Don't use Ruby 2.2, it's EOL since forever and it's just broken with modern OS/C compilers
- Use ubuntu-20.04
- Use a Docker image
この中から、僕はDockerを選びました。
Dockerを使ってRails 4.2を動かす
ruby - Official Image | Docker Hub を使います。
次のDockerfile
を用意します。
FROM ruby:2.2
# throw errors if Gemfile has been modified since Gemfile.lock
RUN bundle config --global frozen 1
WORKDIR /usr/src/app
COPY Gemfile Gemfile.lock ./
RUN gem install bundler -v 1.17.3
RUN bundle install --jobs 4
CMD ["bin/rails", "s", "-b", "0.0.0.0"]
bundler
はバージョンを指定しないと最新版がインストールされます。
最新のbundler
はRuby 2.2では動きません。
Ruby 2.2 で 動く bundler
のバージョンを指定します。
次のコマンドでコンテナをビルドします。
docker buildx build -t temp .
次のコマンドでコンテナを起動します。
docker run --rm -v (pwd):/usr/src/app -p 3000:3000 temp
次のように、Railsアプリケーションが起動するのがわかります。
[2024-02-02 09:07:52] INFO WEBrick 1.3.1
[2024-02-02 09:07:52] INFO ruby 2.2.10 (2018-03-28) [x86_64-linux]
[2024-02-02 09:07:52] INFO WEBrick::HTTPServer#start: pid=1 port=3000