ググると沢山出てくるテーマでアレなんですが、これが楽かなと思う方法をご紹介します。
全体像
- イメージを作る環境自体はVagrant上の仮想マシンを利用する。作成しようとしているOSにあわせておくと良い(バージョンが違っても大丈夫)
- 仮想マシン自体のセットアップはもちろんのこと、Dockerのイメージを作るところまでVagrantの
File Provisioner
とShell 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 = <<SCRIPT
MIRROR_URL="http://mirrors.usc.edu/pub/linux/distributions/centos/#{version}/os/x86_64/"
MIRROR_URL_UPDATES="http://mirrors.usc.edu/pub/linux/distributions/centos/#{version}/updates/x86_64/"
cp /tmp/epel.repo /etc/yum.repos.d/epel.repo
yum install --enablerepo=epel -y febootstrap
febootstrap -i bash -i coreutils -i tar -i bzip2 -i gzip -i vim-minimal -i wget -i patch -i diffutils -i iproute -i yum centos centos#{version} $MIRROR_URL -u $MIRROR_URL_UPDATES
touch centos#{version}/etc/resolv.conf
touch centos#{version}/etc/sysconfig/network
touch centos#{version}/sbin/init
tar --numeric-owner -zcpf centos-#{version}.tar.gz -C centos#{version} .
mv centos-#{version}.tar.gz /export/
SCRIPT
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "opscode-centos-#{version}"
config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-#{version}_chef-provisionerless.box"
config.vm.synced_folder "./export", "/export"
config.vm.provider "virtualbox" do |vb|
vb.gui = true
vb.customize ["modifyvm", :id, "--memory", "1024"]
end
config.vm.provision "file", source: "./conf/epel.repo", destination: "/tmp/epel.repo"
config.vm.provision :shell, :inline => script
end
あとは
vagrant up --provision
コマンドを実行すればOKです。しばらくするとカレントディレクトリにcentos-6.5.tar.gz
といった名前でファイルが出来上がりますので、
cat export/centos-6.5.tar.gz | docker import - ryuzee/centos:6.5
などとしてローカル環境で登録してください。もちろんこれをdocker.io
に登録したければ、以下のようにすればOKです。
docker push ryuzee/centos:6.5
非常に簡単ですね。