LoginSignup
4
2

More than 1 year has passed since last update.

CentOS 7 に新しめの Ruby をパッケージからインストールする方法

Last updated at Posted at 2021-02-02

背景

  • 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
コミュニティが独自にビルドしたものが提供されています。サードパーティ的なイメージ。

基本的には centos-sclo-rh の方を使うほうが無難と思います。
もし使いたいバージョンが見つからなければ、もう一つの方を探して試してみる、といった感じかな。

利用可能なパッケージについては ここから 調べることが出来ますが、どうも更新が行われていないような感じもするので、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


  1. Ruby 2.7, Ruby 3.0 をインストールする場合は、ruby26 の部分をそれぞれ ruby27 ruby30 と読み替えてください。 

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2