背景
- CentOS 7.x で 新しめの Ruby が使いたかった
-
yum install ruby
するとデフォルトでは Ruby 2.0 が入る - 少しぐぐってみると rbenv を使うという記事が多数。開発環境ならそれでいいけど、本番環境ではビルドしたくないのよね〜
解決策
Software Collections(SCL) からインストールすれば、任意のバージョンの Ruby をサクッと(ビルドせずに)インストールできます。
以下は Ruby 2.6 での手順ですが、ruby26
の部分を例えば ruby25
にすれば 2.5
系がインストールできるようです1。
また、タイトルでは CentOS 7 と書いていますが、CentOS 8 でも RHEL でも同じ方法でインストール可能と思います。
インストール手順
# Software Collections(SCL) を使えるようにする
sudo yum -y install centos-release-scl-rh centos-release-scl
# SCLから Ruby 2.6 をインストール
sudo yum --enablerepo=centos-sclo-rh -y install rh-ruby26 rh-ruby26-ruby-devel
# ログイン時に自動的に SCL の Ruby を有効化するためのプロファイル
sudo bash -c "echo 'source scl_source enable rh-ruby26' > /etc/profile.d/rh-ruby26.sh"
確認
ログインしなおして ruby -v
コマンドで確認します。
$ ruby -v
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux]
あとは gem install rake
などしても普通に使用できます。
試した環境
CentOS 7.9 (x64) です。
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
Dockerコンテナの場合
Dockerfile に以下のように書くだけです。
FROM centos:7.7.1908
# install Ruby2.6 from SCL
RUN yum -y install centos-release-scl-rh centos-release-scl \
&& yum --enablerepo=centos-sclo-rh -y install rh-ruby26 \
&& echo 'source scl_source enable rh-ruby26' >> /etc/profile.d/rh-ruby26.sh
ただこれでビルドしたイメージに対して bash で入って ruby -v
とかやるとちゃんと動くのですが、Dockerfile 内で後続のビルドステップで ruby
コマンドを使おうとすると、パスが通ってなくてエラーになります。
RUN ruby -v # これだとエラーになる。 /bin/sh: ruby: command not found
以下のように SCL を有効化してからやれば大丈夫です。
RUN source scl_source enable rh-ruby26 && ruby -v # これならOK
1回だけなら上記でOKですが、何回もやる場合は煩雑になるので、Dockerビルドで使用するシェルを bash に変更し、/etc/profile
を読み込ませることでずっとSCLが有効になります。
# シェルをbashに変更し、/etc/profile を読み込ませる
SHELL ["/bin/bash", "-c"]
ENV BASH_ENV=/etc/profile
RUN ruby -v # SCLが有効されているのでエラーにならない
Software Collections(SCL) とは
Software Sollections(SCL) とは、各ソフトウェアの様々なバージョンを柔軟にインストールする方法として RedHat より提供されている、独立したパッケージ管理システムです。OS標準のパッケージ管理システムとは別のサポートサイクルになっています。
SCLを使用すると、同一システム上で複数のバージョンのソフトウェアを共存させ、利用シーンごとに使用するバージョンを切り替えたりできます。
Ruby の世界でいう rbenv
みたいなイメージですね。
なお CentOS 向けのSCLリポジトリとしては以下の2種類があるようです。
- centos-sclo-rh
- Red Hat 由来パッケージが提供されています。末尾に rh がついてますし、こっちが標準的なものっぽい。
- centos-sclo-sclo
- コミュニティが独自にビルドしたものが提供されています。サードパーティ的なイメージ。
利用可能なパッケージについては ここから 調べることが出来ますが、どうも更新が行われていないような感じもするので、yum search
コマンドを使って検索する方が確実なようです。
実際、2021年11月現在では上記サイトには Ruby2.7 が上がっていないのですが、yum search ruby27
として検索すると見つかります。
ちなみに今日SCLについて調べてみるまで、僕も知らなかった。。。笑
参考
https://www.server-world.info/query?os=CentOS_7&p=ruby26
https://www.greptips.com/posts/1288/
https://blog1.mammb.com/entry/2019/12/01/090000
-
Ruby 2.7, Ruby 3.0 をインストールする場合は、
ruby26
の部分をそれぞれruby27
ruby30
と読み替えてください。 ↩