Scientific Linux 7.0, 7.1 の Docker ベースイメージを作る

タイトルのまんまですが、ScientificLinux 7.0, 7.1用の Dockerベースイメージを作りました。
一年くらい前に6.5のものを使っ他やり方（[Scientific LinuxのDockerイメージを作成する - リジェクトされました](http://ri.hateblo.jp/entry/2014/06/15/020120)）でつくろうとしたらうまく行かなかったのでメモしておこうと思います。

まず、Scientific Linux 7.0/7.1 の VirtualBox イメージを準備しましたが、これはまた別の機会に書こうと思います。
ということで、VMのイメージはこれ（[ringo | Atlas by HashiCorp](https://atlas.hashicorp.com/ringo)）を使います。

作成したコンテナはこちら([Docker Hub](https://hub.docker.com/r/ringo/scientific/tags/))

## Scientific Linux の Docker ベースイメージを作成

### Vagrantfile を作成する

まず、ベースとなるVagrantfileを作成します。
特にかわったことはしていません。
vboxに `ringo/scientific-linux-7.0` を指定しています。
このイメージを作成する元のスクリプトは[こちら](https://github.com/ringohub/packer-scientifclinux)です。
あと、 `provision` に `build.sh` を指定しています。

```ruby
VAGRANTFILE_API_VERSION = '2'

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = 'ringo/scientific-linux-7.0'
  config.vm.network 'private_network', ip: '192.168.33.11'
  config.vm.provision :shell, :path => 'build.sh'
end
```

### Build.sh を作成する

ここにDockerイメージを作成するメインの処理を書きます。
作成するためのコマンドは以前と異なり、 `febootstrap` コマンドに代わって `supermin5` コマンドを使います。

普通に `yum install -y supermin` をしてしまうと1.4系が入ってしまうので注意。
`--prepare` オプションでインストールしておきたいパッケージを指定します。
今回は `yum` のみ。あとは、フォーマットに `chroot` を指定してビルドするだけ。

```bash
# Install supermin
yum update -y && yum install -y supermin5

# Build
supermin5 --prepare yum -o supermin.d && \
  supermin5 --build --format chroot supermin.d -o appliance.d
```

### Locale や I18N を削除

ココらへんを削除するとコンテナのサイズが軽くなります（[supermin - fedoraのDockerイメージを作成する - Qiita](http://qiita.com/MiCHiLU/items/762275df727b60c3ff41#3-5)
）

```
# Remove locales
readonly LOCALE_DIR=${CMD_PATH}/appliance.d/usr/share/locale
mv ${LOCALE_DIR}/en ${LOCALE_DIR}/en_US /tmp && \
  rm -rf ${LOCALE_DIR}/* && \
  mv /tmp/en /tmp/en_US ${LOCALE_DIR}/

# Remove i18ns
readonly I18N_DIR=${CMD_PATH}/appliance.d/usr/share/i18n/locales
mv ${I18N_DIR}/en_US /tmp && \
  rm -rf ${I18N_DIR}/*  && \
  mv /tmp/en_US ${I18N_DIR}/
```

### Tarball の作成

`tar` で固めて圧縮します。それだけ。

```
# Create tarball and compress
cd ${CMD_PATH}/appliance.d && tar --create . | xz --best > /vagrant/scientific-linux_${VERSION}_x86_64.tar.xz
```

### コンテナを作成して Docker Hub にプッシュ

```
# Install the docker
curl -sSL https://get.docker.com/ | sh

# docker import and push
cat /vagrant/scientific-linux_${VERSION}_x86_64.tar.xz | docker import - ringo/scientific:${VERSION} && \
  docker push ringo/scientific:${VERSION}
```

## yum update するとマイナーバージョンが上がってしまう

7.0をわざわざ入れる人は7.0を使いたいというモチベーションがあって入れるわけなので、lockしてあげたかったけど、
やり方がよくわからなかったので、最終的には `yum` 実行時に `--releasever` で指定することにした。

### 色々試した

`/etc/yum/vars/releasever` に色々書いてみて実験した。
`7.0` と書いてみると、`7.1` にアップグレードされた。
`70` と書いてみると、やはり `7.1` にアップグレードされた。

`/etc/yum/vars/slreleasever` に色々書いてみて実験した。
`7.0` と書いてみると、 `/etc/yum/vars/releasever` ができて `7` が書かれてた。
そのまま、もう一度 `yum update` したら `7.1` にあがる。
`70` と書いてみると、エラーになってしまう。

他にもなにかやった気がするけど、忘れた。



## References

- [CentOS7のDocker Imageを自作する - re:inventing the wheel](http://marmotte.pyrites.jp/blog/2015/01/15/create-docker-image-of-centos7/)
- [supermin - fedoraのDockerイメージを作成する - Qiita](http://qiita.com/MiCHiLU/items/762275df727b60c3ff41)
- [ringo | Atlas by HashiCorp](https://atlas.hashicorp.com/ringo)
- [ringohub/docker-base-image · GitHub](https://github.com/ringohub/docker-base-image)
- [Scientific LinuxのDockerイメージを作成する - リジェクトされました](http://ri.hateblo.jp/entry/2014/06/15/020120)
- [RPM が管理しているファイルを確認する方法 - Qiita](http://qiita.com/Yasutaka0822/items/995be186b7d7a1cb06b7)
- [CentOS7でDockerを動かす場合 - しまかぜメモ](http://shimakaze.hatenablog.com/entry/2015/04/02/103449)