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

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

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

作成したコンテナはこちら(Docker Hub )

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

Vagrantfile を作成する

まず、ベースとなるVagrantfileを作成します。 特にかわったことはしていません。 vboxに ringo/scientific-linux-7.0 を指定しています。 このイメージを作成する元のスクリプトこちらです。 あと、 provisionbuild.sh を指定しています。

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 を指定してビルドするだけ。

# 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

# 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