ひとつの Dockerfile から複数の Docker イメージをビルドすることができます。
背景
インフラ環境まわりを Docker 化している場合、しばしば複数の Docker イメージを同時並行的に管理する必要が生じます。例えばミドルウェアのバージョンの組み合わせをいろいろ試したいとか、開発環境と本番環境とで設定を変えたいとか。
一方、一般的にイメージとしてビルドされる情報はすべて Dockerfile に記述されており、docker build
コマンドの際にはパラメータを渡すことができないため、いきおい、一部分だけ異なる Dockerfile を複数管理する状況に陥ったりします。
これは面倒だし、Dockerfile に変更を入れるときに漏れが出ないとも限らない。できれば一元化したい。
VoicePipe はこのような状況に対応し、単独の Dockerfile にパラメータを導入して、そこから相異なる複数の Docker イメージをビルドするためのツールです。
インストール
$ go get https://github.com/y-taka-23/voicepipe
使い方
例として、開発環境用と本番環境用に、index.html の内容がそれぞれ異なるふたつの Nginx の Docker イメージを作成する必要があるとしましょう。
最終的な作業用ディレクトリの中身は次のようになります。ちなみに同じものが GitHub リポジトリの example
以下に作成してあります。
+--- Dockerfile +--- index | +--- index_develop.html | +--- index_latest.html | `--- index_production.html `--- voicepipe.yml
まず、Dockerfile
の中身は次のようにしましょう。差し替える予定のパラメータとなる部分が、ENV
コマンドによって環境変数 INDEX_HTML
として定義されていることに注意します。
FROM nginx ENV INDEX_HTML index_latest.html COPY index/${INDEX_HTML} /usr/share/nginx/html/index.html
次に、必要なイメージのパラメータを voicepipe.yml
に記述します。
repository: user/nginx images: - tag: develop description: "for the development environment" parameters: - name: INDEX_HTML value: index_develop.html - tag: production description: "for the production environment" parameters: - name: INDEX_HTML value: index_production.html
最後に voicepipe.yml
と同じディレクトリ内で
$ voicepipe build
を実行すると、ふたつの Docker イメージ user/nginx:develop
と user/nginx:production
がビルドされるはずです。もちろん、各々のイメージ内の index.html
にはそれぞれ対応するものが COPY
されています。
動作原理
ls -a
などを実行するとわかりますが、ビルドしたあとの作業ディレクトリには次のような隠しディレクトリ .voicepipe
が生成されています。
+--- .voicepipe | +--- develop | | +--- Dockerfile | | `--- index | | +--- index_develop.html | | +--- index_latest.html | | `--- index_production.html | `--- production | +--- Dockerfile | `--- index | +--- index_develop.html | +--- index_latest.html | `--- index_production.html +--- Dockerfile +--- index | +--- index_develop.html | +--- index_latest.html | `--- index_production.html `--- voicepipe.yml
また .voicepipe/develop
と .voicepipe/production
の中にある Dockerfile を見ると、voicepipe.yml
の指定に従って ENV
行が書き変わっているのがわかるはずです。実際にビルドされているのはこれら生成された Dockerfile です。
なお、Dockerfile を Git で管理している場合はこの .voicepipe
は邪魔なので、.gitignore
で無視させるか、あるいはビルド後に voicepipe clean
を実行すると削除してくれます。
その他
ちなみに、voicepipe list
を実行するとビルドできるイメージとその説明が一覧で表示されたり、voicepipe build -L
とするとついでに元の Dockerfile を latest
タグでビルドしたりします。
なお、Docker 1.6 から、Dockerfile 中のLABEL
行でイメージにラベルを付与する機能がつきました。VoicePipe でもこのラベルを設定できるようにしようかと思っているのですが、それはまた別の話。