はじめに
Ruby 2.5.1 + Rails 5.2 環境で作成したアプリをphusion/passenger-ruby25イメージを利用してコンテナ化した際に何箇所か引っかかったところがあったので備忘録として投稿します。
- Ruby 2.5.1 を利用できるようにする ←本投稿
- Rails 5.2 のアプリが起動しない
- Railsのログがコンソールへ出力されない
問題点
Ruby 2.5.1 環境で作成したアプリをphusion/passenger-ruby25イメージを利用してビルドすると、bundle install
時に失敗する。
$ docker build -t rails-image .
...
Step 13/19 : RUN bundle install
---> Running in 8c0c00cc6fd1
Required ruby-2.5.1 is not installed.
To install do: 'rvm install "ruby-2.5.1"'
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
installing your bundle as root will break this application for all non-root
users on this machine.
Your Ruby version is 2.5.0, but your Gemfile specified 2.5.1
The command '/bin/sh -c bundle install' returned a non-zero code: 18
解決方法
コンテナビルド時に Ruby 2.5.1 をインストールして、デフォルトで利用するように指定する。
準備
phusion/passenger-ruby25イメージで切り替え/インストール可能なRubyのバージョンを確認する。
# コンテナ名 tmpで
# phusion/passenger-ruby25:latest
# イメージを起動する
$ docker run phusion/passenger-ruby25:latest
# 停止させるときは「Ctrl + C」
# 別のターミナルで、
# コンテナIDを確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57447e5d7173 phusion/passenger-ruby25:latest "/sbin/my_init" 1 second ago Up 4 seconds 80/tcp, 443/tcp hardcore_jang
# 切り替え可能なRubyバージョンを確認する
# 補足:<CONTAINER ID>は`docker ps`で確認した値に変更する
$ docker exec -it <CONTAINER ID> bash -l -c 'rvm list'
rvm rubies
=* ruby-2.5.0 [ x86_64 ]
# => - current
# =* - current && default
# * - default
Dockerfile
調査時点のphusion/passenger-ruby25イメージにはRuby 2.5.1がインストールされてなかったので、2.5.1をインストールしてデフォルトで利用するようにDockerfileで指定する。
Dockerfile
FROM phusion/passenger-ruby25:latest
# Ruby 2.5.1 をインストール
RUN bash -lc 'rvm install 2.5.1'
# Ruby 2.5.1 をデフォルトで利用するように設定
RUN bash -lc 'rvm --default use ruby-2.5.1'
# 省略
バージョン確認
コンテナを起動して、Rubyのバージョンを確認する
# イメージ名 passenger-ruby251 を指定してビルド
# 補足:Dockerfileが配置されてるディレクトリで実行する
$ docker build -t passenger-ruby251 .
...
Successfully built d7b5b31b09c0
Successfully tagged passenger-ruby251:latest
# イメージを起動する
$ docker run passenger-ruby251
# 別のターミナルで、
# コンテナIDを確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
106fcca82a3b passenger-ruby251 "/sbin/my_init" 37 seconds ago Up 40 seconds 80/tcp, 443/tcp friendly_lalande
# 切り替え可能なRubyバージョンを確認する
# 補足:<CONTAINER ID>は`docker ps`で確認した値に変更する
$ docker exec -it <CONTAINER ID> bash -l -c 'ruby -v'
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
注意事項
デフォルトで利用するRubyバージョンを切り替えたので、nginxのコンフィグに記述するpassenger_ruby
のパスでは/usr/bin/ruby
を指定する。
webapp.conf
server {
# 省略
# If this is a Ruby app, specify a Ruby version:
# passenger_ruby /usr/bin/ruby2.5;
# =>
passenger_ruby /usr/bin/ruby;
# 省略
}