rbenv を使える Docker イメージを作成する

タイトル通りですが、 rbenv を使うことができる Docker イメージを作成します。


参考

実行環境

  • macOS Mojave 10.14.4

実装

今回は、ubuntu:18.04をベースにして rbenv を導入し、複数の ruby を使用できる docker イメージを作成します。
サンプル 2 種類はそれぞれ、ruby2.3.0 と ruby2.6.0 を導入することにします。

dockerfile を作成(パターン 1)

dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM ubuntu:18.04

# パッケージリスト更新
RUN apt-get update

# rubyビルドに必要なパッケージを取得(1)
RUN apt-get -y install git curl wget bzip2 autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev

# rubyビルドに必要なパッケージを取得(2):rubyの古いものはssl1.0を使いたいので別途インストール
# (1)でlibssl-devとlibssl1.0-devを両方書くことはできるが、競合したので別で実行する。
RUN apt-get -y install libssl1.0-dev

# rbenvの導入
RUN cd ~/ && \
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

# 環境変数の登録
ENV PATH /root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin::$PATH

# ruby-buildの導入とrubyのインストール
RUN cd ~/ && \
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build && \
rbenv install -l && \
LDFLAGS=-L/root/.rbenv/versions/2.3.0/lib CPPFLAGS=-I/root/.rbenv/versions/2.3.0/include rbenv install 2.3.0 && \
rbenv install 2.6.0 && \
rbenv versions

dockerfile を作成(パターン 2)

dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM ubuntu:18.04

# パッケージリスト更新
RUN apt-get update

# rubyビルドに必要なパッケージを取得(1)
RUN apt-get -y install git curl wget bzip2 autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev

# rubyビルドに必要なパッケージを取得(2):rubyの古いものはssl1.0を使いたいので別途インストール
# (1)でlibssl-devとlibssl1.0-devを両方書くことはできるが、競合したので別で実行する。
RUN apt-get -y install libssl1.0-dev

RUN cd ~/ && \
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv && \
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile && \
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile && \
. /root/.bash_profile && \
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build && \
rbenv install -l && \
LDFLAGS=-L/root/.rbenv/versions/2.3.0/lib CPPFLAGS=-I/root/.rbenv/versions/2.3.0/include rbenv install 2.3.0 && \
rbenv install 2.6.0 && \
rbenv versions

# 環境変数の登録
ENV PATH /root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin::$PATH

パターン 1 とパターン 2 の違いは、環境変数の取り扱いです。
パターン 1 はENV PATH /root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin::$PATHを途中で実行し、$PATH を参照します。
パターン 2 では、. /root/.bash_profileとすることで、.bash_profileに書いた$PATH を参照します。
パターン 2 でも、ENV PATH /root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin::$PATHを最後に書きます。
これは、後の行うdocker run -it ubuntu-rbenvの際に、.bash_profileを読み込まないことの対策です。
もし、ENV PATH /root/~~~~を記述しない場合は、コンテナへ入る度に、source .bash_profileを行えばいいです。

確認

dockerfile を作成したら、dockerfile と同じディレクトリで、以下コマンドを実行。

1
docker build -t ubuntu-rbenv .

しばらく眺めておきます。結構待ちます。
終わったら、以下を実行。

1
2
3
4
# コンテナの中に入る
docker run -it ubuntu-rbenv
# 導入されたrubyのバージョン確認
rbenv versions

ruby2.3.8 以下をインストールする場合は、以下は次のようにします。
(確認できた範囲なので、バージョン次第で別のオプションを必要とする可能性があります。)

1
2
LDFLAGS=-L/root/.rbenv/versions/[rubyバージョン]/lib CPPFLAGS=-I/root/.rbenv/versions/[rubyバージョン]/include rbenv install [rubyバージョン]

2.4.0 以降は、素直に rbenv コマンドでインストールすればいいです。


今回は、rbenv で ruby2.3.0 と ruby2.6.0 のインストールを dockerfile で実現しました。
rbenv install --listで確認できるバージョンが多すぎるので、すべては試していません。(できるわけありません。)
試しに、2.3.0, 2.3.8, 2.4.6, 2,6,0の 4 つを導入した docker イメージをビルドしたら、大体 1 時間ちょっとかかりました。
Macbook(pro じゃない)でやるものではないですね。

ではでは。