DockerのCentOSベースイメージを簡単に作る方法

 2014/12/09
このエントリーをはてなブックマークに追加

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

全体像

  • イメージを作る環境自体は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 = <<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

非常に簡単ですね。

 2014/12/09
このエントリーをはてなブックマークに追加

サイト内検索


著作

寄稿

Latest post: