みなさんこんにちは。@ryuzeeです。

ググるとたくさん出てくるテーマでアレなんですが、これが楽かなと思う方法をご紹介します。

全体像

  • イメージを作る環境自体はVagrant上の仮想マシンを利用する。作成しようとしているOSにあわせておくと良い(バージョンが違っても大丈夫)
  • 仮想マシン自体のセットアップはもちろんのこと、Dockerのイメージを作るところまでVagrantのFile ProvisionerShell Provisonerを使って何度でも同じことができるようにする
  • File Provisionerはepelのレポジトリを有効にするためだけに使っており、Shell Provisonerでイメージの作成をする

作業手順

今回作成するのはCentOSのイメージですが、このルートイメージを作成するためにfebootstrapを使います。febootstrapは標準のyumレポジトリには含まれていないのでepelのレポジトリを有効にする必要があります。いちいち手で仮想マシンに変更を加えるのはあり得ないので、事前に以下の内容でファイルを作っておきます。ファイル名はconf/epel.repoとします。見ればわかる通り、普通のyumの設定ファイルです。本当に必要なときだけコマンドラインでこのレポジトリを有効にすれば良いので、enabled=0にしてあります。

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
enabled=0
failovermethod=priority
gpgcheck=1
gpgkey=http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-6&arch=$basearch
sslverify=true

次にVagrantで色々やる準備をします。以下のような内容でVagrantfileを用意してください。もしboxを他のものに変えたければ適宜指定すればOKです。また以下の例ではbox_urlパラメータが指定されているので、もし手元にboxがなくても自動でダウンロードしてくれます。

たいした肝はありませんが、肝心なのは冒頭の方にあるスクリプトの部分です。epelのレポジトリを有効にしてfebootstrapをインストールし、CentOSのミラーリストを指定した上で最低限のパッケージを導入、さらにいくつか必要なファイルを作成した上で圧縮をかけている、という処理になります。なお圧縮をかける際、xzで圧縮してしまうとDocker 1.3.2のバグを見事に踏まされるので、gzipでの圧縮が良いです。

 # -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
if !File.exists?(File.dirname(__FILE__) + "/export")
 Dir::mkdir(File.dirname(__FILE__) + "/export")
end
version = ENV["CENTOS_BUILD_VERSION"] ? ENV["CENTOS_BUILD_VERSION"] : "6.5"
script = <