Dockerfileとdocker buildで CeontOS7 + システムワイドなrbenv + ruby のコンテナを作る


#0. 前書き
![docker.png](https://qiita-image-store.s3.amazonaws.com/0/31816/e91ca4c3-9ea1-ddea-9384-0f9eeb6f80d3.png) 　　+ ![スクリーンショット 2015-10-18 16.24.32.png](https://qiita-image-store.s3.amazonaws.com/0/31816/23f3c9df-ebd2-75b7-05ff-e9d6df96b57b.png) +　　rbenv　　+　　![Ruby_logo.png](https://qiita-image-store.s3.amazonaws.com/0/31816/6c9b5e9f-2ae1-78cd-adf5-390c01b7e967.png)

Docker Hubで配布されているオフィシャルのCentOS7（CeontOS.7.1.1503）のイメージを下敷きに、 rbenv + ruby 導入済みのDockerコンテナ作成します。

ただし、作成したコンテナでの作業ではなく、**Dockerfileでrbenvとrubyの導入を行います**。ナニソレイメージダケアレバイイデスヨ、的な人にはある意味無駄情報ですが、イメージの由来が気になる人や、自分でモニョモニョしたい人には役立つかと思います。

作成されるコンテナの中身はこんな感じです。

- CentOS 7.0.1406ベース
- rbenvはrbenvグループのユーザーで利用可能
- ruby 2.1.7
- sudo rbenvできる


#1. Dockerを導入して起動する
これは本家のサイトを確認しましょう。ネットにいろいろありますが、いろいろな意味で本家が一番よくまとまっていると思います。
[Installation on CentOS - Docker Docs](https://docs.docker.com/installation/centos/)

#2. rbenv+rubyするDockerfileを作成する
ホームディレクトリに作業ディレクトリを作成して、そこにDockerfileを配置、記述することにしましょう。

まず作業ディレクトリを作って、viでファイルを開いて

```
$ mkdir ~/docker-cent-rbenv-ruby
$ cd ~/docker-cent-rbenv-ruby
$ vi Dockerfile
```
で、以下の内容を入力します。

```lang:Dockerfile
FROM centos:centos7.0.1406
MAINTAINER okahashi117
RUN yum -y install make tar git wget gcc-c++ openssl-devel readline-devel gdbm-devel libffi-devel zlib-devel curl-devel procps autoconf sudo
RUN git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
RUN mkdir /usr/local/rbenv/shims /usr/local/rbenv/versions /usr/local/rbenv/plugins
RUN groupadd rbenv
RUN chgrp -R rbenv /usr/local/rbenv
RUN chmod -R g+rwxXs /usr/local/rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
RUN chgrp -R rbenv /usr/local/rbenv/plugins/ruby-build
RUN chmod -R g+rwxs /usr/local/rbenv/plugins/ruby-build
RUN /usr/local/rbenv/plugins/ruby-build/install.sh
RUN git clone https://github.com/sstephenson/rbenv-default-gems.git /usr/local/rbenv/plugins/rbenv-default-gems
RUN chgrp -R rbenv /usr/local/rbenv/plugins/rbenv-default-gems
RUN chmod -R g+rwxs /usr/local/rbenv/plugins/rbenv-default-gems
RUN echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
RUN echo 'export PATH="/usr/local/rbenv/bin:$PATH"' >> /etc/profile.d/rbenv.sh
RUN echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
RUN echo '%rbenv ALL=(ALL) ALL' >> /etc/sudoers
RUN su -l root -c '/usr/local/rbenv/bin/rbenv install 2.1.7 -v'
RUN su -l root -c '/usr/local/rbenv/bin/rbenv rehash'
RUN su -l root -c '/usr/local/rbenv/bin/rbenv global 2.1.7'
```

やや長いですが、やっていることは単純で...

### i.e.1 centos7のイメージを下敷きにして
![スクリーンショット 2015-10-18 16.24.32.png](https://qiita-image-store.s3.amazonaws.com/0/31816/23f3c9df-ebd2-75b7-05ff-e9d6df96b57b.png)

> FROM centos:centos7.0.1406

### i.e.2 事前にrubyのビルド必要なパッケージを導入し
![Yum-2.png](https://qiita-image-store.s3.amazonaws.com/0/31816/bc9e8e2f-db2d-7085-47c5-777945bc5446.png)

> RUN yum -y install make tar git wget gcc-c++ openssl-devel readline-devel gdbm-devel libffi-devel zlib-devel curl-devel procps autoconf sudo

### i.e.3 rbenvと、ruby-build, rbenv-default-gemを導入します
![スクリーンショット 2015-10-18 16.17.12.png](https://qiita-image-store.s3.amazonaws.com/0/31816/af6dcd9e-67c6-c5f4-c7f7-56348d9ff8b1.png)

rbenvグループのユーザーでで利用可能とするため、rbenvグループを作成するとともに、rbenv自体は /usr/local/rbenv以下に導入します。

rbenv-default-gemは実際何も設定していませんが、gemパッケージの導入をかねて導入しています。

> RUN git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
> RUN mkdir /usr/local/rbenv/shims /usr/local/rbenv/versions /usr/local/rbenv/plugins
> RUN groupadd rbenv
> RUN chgrp -R rbenv /usr/local/rbenv
> RUN chmod -R g+rwxXs /usr/local/rbenv
> RUN git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
> RUN chgrp -R rbenv /usr/local/rbenv/plugins/ruby-build
> RUN chmod -R g+rwxs /usr/local/rbenv/plugins/ruby-build
> RUN /usr/local/rbenv/plugins/ruby-build/install.sh
> RUN git clone https://github.com/sstephenson/rbenv-default-gems.git /usr/local/rbenv/plugins/rbenv-default-gems
> RUN chgrp -R rbenv /usr/local/rbenv/plugins/rbenv-default-gems
> RUN chmod -R g+rwxs /usr/local/rbenv/plugins/rbenv-default-gems


### i.e.4 必要な環境変数を設定します。
![16404871853_41b7e3652c_m.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/e5000a16-6e45-09e2-31a2-615b6c71498f.jpeg)

すべてのユーザーで利用できるようにするため、/etc/profile.d以下にシェルファイルを配置しています。
/etc/sudoersへの編集はsudo対応のためです。
rbenvグループに対してsudoの実行を許可しています。なお、sudo実行するとPATH情報が引き継がれませんが、これはsudoの実行時の -i オプションで対応します。
sudoersを直接編集していますので気をつけて。

> RUN echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
> RUN echo 'export PATH="/usr/local/rbenv/bin:$PATH"' >> /etc/profile.d/rbenv.sh
> RUN echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
> RUN echo '%rbenv ALL=(ALL) ALL' >> /etc/sudoers



###i.e.5 最後、実際にrbenvのコマンドによってruby 2.1.7をインストールし既定に設定しています。
![Ruby_logo.png](https://qiita-image-store.s3.amazonaws.com/0/31816/b81181fd-b619-3237-67a0-9ac0d64cc4b7.png) 

お好みによって編集してバージョンを変えたり、削除してrubyの導入をやめる(コンテナ作成後に実施）でもよいと思います。

> RUN su -l root '/usr/local/rbenv/bin/rbenv install 2.1.7 -v'
> RUN su -l root '/usr/local/rbenv/bin/rbenv rehash'
> RUN su -l root '/usr/local/rbenv/bin/rbenv global 2.1.7'

#2. Docker イメージ作成
以下のコマンドを実行します。

```
$ cd ~/docker-cent-rbenv-ruby
$ sudo docker build -t centos7-rbenv-ruby:1 .
```

それなりの時間（環境にもよりますが5分くらい？）がかかりますが、気楽に待ちましょう。
べろべろときて...

```
...（中略）
Step 21 : RUN su -l root -c '/usr/local/rbenv/bin/rbenv global 2.1.7'
 ---> Running in 3ba885ade337
 ---> 8fb3001717ca
Removing intermediate container 3ba885ade337
Successfully built 8fb3001717ca
```

#3. Docker コンテナ起動
```
$ sudo docker run -i -t centos7-rbenv-ruby:1 /bin/bash
```


#4. 確認
本来いろいろ確認することはありますが、ざっくりいきましょう。
とりあずrbenv -v コマンド。

```
# rbenv -v
rbenv 0.4.0-169-g0f44c57
```

rubyのインストール状況確認。

```
# rbenv versions
* 2.1.7 (set by /usr/local/rbenv/version)
```

rubyコマンド確認。

```
# ruby -v
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux]
```

ユーザー変更からの動作確認

```
# useradd test
# usermod -G rbenv test
# passwd test
Changing password for user test.
New password: *設定したパスワード*
Retype new password: *設定したパスワード*
passwd: all authentication tokens updated successfully.
# su test

$ rbenv -v
rbenv 0.4.0-169-g0f44c57
$ rbenv versions
* 2.1.7 (set by /usr/local/rbenv/version)
$ ruby -v
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux]
```

ruby別バージョン（2.0.0. p467）追加。

```
$ rbenv install 2.0.0-p647
...（中略）
-> https://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p647.tar.gz
Installing ruby-2.0.0-p647...
Installed ruby-2.0.0-p647 to /usr/local/rbenv/versions/2.0.0-p647
$ rbenv versions
  2.0.0-p647
* 2.1.7 (set by /usr/local/rbenv/version)
```

sudoコマンドによるrbenv globalの実行と結果確認。
-iオプションを忘れないこと。

```
$ sudo -i rbenv global 2.0.0-p647
[sudo] password for test:
$ rbenv vresions
* 2.0.0-p647 (set by /usr/local/rbenv/version)
  2.1.7
```

別ユーザー（root）側にも反映されていることの確認

```
$ exit
# rbenv versions
* 2.0.0-p647 (set by /usr/local/rbenv/version)
  2.1.7
```

gemが使えることの確認。
バージョン確認と試しのbundlerインストール。

```
# gem -v
2.0.14.1
# gem install bundler
Fetching: bundler-1.10.6.gem (100%)
Successfully installed bundler-1.10.6
Parsing documentation for bundler-1.10.6
Installing ri documentation for bundler-1.10.6
1 gem installed
```


#5. その他
適宜Dockerfileは用途にあわせていじってください。
余計なものもyumってたりするので。

おしまい