CentOS 3 の Docker イメージを作ってみた

先日の Bash 脆弱性騒ぎに関連して、ごく一部で残ってる RHEL3 系のマシンにも Bash のパッチを当てざるを得ない状況が発生したため、この際パッケージビルド用の Docker イメージも作っておくか、ということでやってみた

必要なもの

  • CentOS 3 がインストールされているサーバないし仮想マシン
  • Yum パッケージ
  • CentOS 3 のパッケージが含まれているリポジトリへのアクセス

CentOS 3 のマシンは楽にやるには必須だと思う。初めは CentOS 6 上でやってみたが、後述のスクリプト実行時に最新の CentOS 6 のパッケージを拾ってこようとするのをうまく回避できなかったので、結局 CentOS 3 上で作業を行った

作成の流れ

といっても、ほとんどやることはなくて、だいたい以下に集約される

  • yum.conf を編集して CentOS 3 パッケージが含まれているリポジトリを参照するようにする
  • Docker プロジェクトが提供している mkimage-yum.sh を持ってきて、 CentOS 3 向けにカスタマイズする
  • スクリプト実行して os_image.tar.gz を得る
  • できた os_image.tar.gz を Docker に食わせてイメージ化する

以下、個々の作業の説明

yum.conf の編集

サーバ内に Yum が入っていなければ、まずはこれが必須なので入れておくのだが、 CentOS 3 はもうメンテされていないので、パッケージを拾ってこれるミラーサーバを yum.conf に設定しておかなければならない。普通は http://vault.centos.org/ を設定しておけばいいと思うが、当たるミラーによってはかなり遅いことになるので、場合によっては速度の出るミラーサーバの IP アドレスを dig なりなんなりで調べて直接 IP アドレスを指定しておく必要があるかもしれない。具体的な変更は yum.conf 内にいくつかある

baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

みたいな行を

baseurl=http://vault.centos.org/3.9/os/i386/

のように書き換えておくだけである

mkimage-yum.sh のカスタマイズ

一番手間取ったのがここだったが、わかってしまえばなんということもない内容。書き換えたスクリプトはこんな感じ

はまったポイントは

  • mktemp が古いためにオプションの扱いが違う。最初気付かずやって、それなりの量のシステムファイルを消してしまった…
  • パッケージを検証する GPG KEY を Yum が勝手には拾ってきてくれないので、自分で先に対象ディレクトリに落としておく
  • なぜか Docker にインポートした後 RPM DB が壊れているようだったので、 yum clean 後に rpm --rebuilddb を実行しておく
  • ldconfig キャッシュは消してもいいが、できたイメージをすぐ使いたい時は、ライブラリが見つからなくていちいち再構築も面倒なので、残しておく

といったところ

スクリプトの実行

これはそのまんま、上記で作成しておいた yum.confmkimage-yum.sh に指定して実行するだけである。うまくいけば os_image.tar.gz がカレントディレクトリ内に作られる

Docker でイメージ化

できた os_image.tar.gz を Docker が動いている環境に持ってきて、下記のようにコマンドを実行する

cat os_image.tar.gz | docker import - centos-3-i386

centos-3-i386 の部分はイメージ名になるので、好きなように設定すればよい。インポートに成功したら、

docker run -i -t centos-3-i386 /bin/bash

のようにして使い始めることができる

まとめ

上記の流れでできたイメージを使って、無事パッチ済みの Bash の RPM の作成もできたので、日常の作業には十分な環境が作成できたと思う

Docker のイメージを作ったのは初めてだったが、 OS が稼働するのに必要なファイル群を tar に固めて食わせるだけ、というのは手軽でいい。各種ディストリビューションごとにマイクロ環境を作れるようなツールがあったりするので、それを使えば気楽にイメージが作れるだろうな、と思う