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.conf
を mkimage-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 に固めて食わせるだけ、というのは手軽でいい。各種ディストリビューションごとにマイクロ環境を作れるようなツールがあったりするので、それを使えば気楽にイメージが作れるだろうな、と思う