phusion/passenger-ruby25イメージでruby2.5.1を利用できるようにする

# はじめに

**Ruby 2.5.1 + Rails 5.2** 環境で作成したアプリを**phusion/passenger-ruby25**イメージを利用してコンテナ化した際に何箇所か引っかかったところがあったので備忘録として投稿します。

- Ruby 2.5.1 を利用できるようにする　←本投稿
- [Rails 5.2 のアプリが起動しない](https://qiita.com/NaokiIshimura/items/bf595e7d2041b1d970d1)
- [Railsのログがコンソールへ出力されない](https://qiita.com/NaokiIshimura/items/95a034fcbe91ddcdcc3e)

# 問題点

Ruby 2.5.1 環境で作成したアプリを**phusion/passenger-ruby25**イメージを利用してビルドすると、`bundle install`時に失敗する。

```shell-session
$ 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のバージョンを確認する。

```shell-session
# コンテナ名　tmpで
# phusion/passenger-ruby25:latest
# イメージを起動する

$ docker run phusion/passenger-ruby25:latest

# 停止させるときは「Ctrl + C」
```

```shell-session
# 別のターミナルで、
# コンテナ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: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
```


```shell-session
# 別のターミナルで、
# コンテナ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`を指定する。

```text:webapp.conf
server {

  # 省略

  # If this is a Ruby app, specify a Ruby version:
  # passenger_ruby /usr/bin/ruby2.5;
  # =>
  passenger_ruby /usr/bin/ruby; 

  # 省略

}
```