使用包管理器在 CentOS 7 上安装较新版本的 Ruby 的方法

背景。

    • CentOS 7.x で 新しめの Ruby が使いたかった

yum install ruby するとデフォルトでは Ruby 2.0 が入る
少しぐぐってみると rbenv を使うという記事が多数。開発環境ならそれでいいけど、本番環境ではビルドしたくないのよね〜

解决办法 (jiě jué cè)

如果您从软件集合(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

如果只是一次的话,以上的方法是可以的。但如果要执行多次的话会变得繁琐,所以建议将用于 Docker 构建的 Shell 更改为 bash,并通过加载 /etc/profile 使 SCL 持续有效。

# シェルをbashに変更し、/etc/profile を読み込ませる
SHELL ["/bin/bash", "-c"]
ENV BASH_ENV=/etc/profile

RUN ruby -v  # SCLが有効されているのでエラーにならない

软件集合(Software Collections,简称SCL)是什么?

软件合集(SCL)是由 RedHat 提供的一种独立的软件包管理系统,用于灵活安装每个软件的不同版本。它拥有与操作系统标准软件包管理系统不同的支持周期。

使用 SCL 可以在同一系统上共存多个软件版本,并可以根据使用场景切换所使用的版本。就像在 Ruby 的世界中使用 rbenv 一样。

据我所知,对于CentOS,存在以下两种类型的SCL软件仓库。

centos-sclo-rh: Red Hat提供的CentOS扩展包,末尾带有”rh”,看起来是官方标准的。

 

centos-sclo-sclo: 社区提供的自建CentOS扩展包,给人一种第三方的感觉。

我认为基本上使用 centos-sclo-rh 更安全。如果找不到所需的版本,可以尝试寻找和尝试另一个选项。

你可以在这里查询可用的软件包,但似乎没有进行更新,所以使用yum search命令进行搜索更为确切。
实际上,在2021年11月,上述网站尚未升级到Ruby2.7,但如果使用yum search ruby27进行搜索,可以找到。

顺便提一下,直到今天我查了一下SCL,我也不知道。。。哈哈

请用中文作为母语回答这个问题。

https://www.server-world.info/query?os=CentOS_7&p=ruby26
– 服务器世界信息:查询CentOS 7操作系统下的Ruby 2.6版本。

https://www.greptips.com/posts/1288/
– Greptips博客:帖子编号为1288。


– Mammb博客1:2019年12月1日发表的文章,时间为09:00:00。

如果要安装Ruby 2.7和Ruby 3.0,请将”ruby26″替换为”ruby27″和”ruby30″。
广告
将在 10 秒后关闭
bannerAds