ベース・イメージの作成

Dockerfile は普通は親イメージから作り始めます。 イメージ内容を完全にコントロールする場合は、ベース・イメージを作り出すこともあります。 その違いは以下のとおりです。

  • 親イメージは基準とするイメージのことです。 Dockerfile 内の FROM ディレクティブによって指定されます。 Dockerfile 内のこれに続く定義は、その親イメージを修正指示するものとなります。 Dockerfile は普通は親イメージから作り始め、ベース・イメージから作るのはまれです。 ただしこの用語は混同されて用いられることもあります。

  • ベース・イメージは Dockerfile において FROM 行がないか、あるいは FROM scratch が記述されます。

ここではベースイメージの生成方法をいくつか示します。 パッケージ化しようとしている Linux ディストリビューションに大きく依存する処理操作もあります。 以下に例をあげていきます。 新たなイメージを提供して頂ける場合は、プルリクエストをあげることをお願いします。

tar を使ったフルイメージの生成

通常であれば、作業マシン上に稼動するディストリビューションを使い、これを親イメージとしてビルドしていくことになります。 しかし Debian の Debootstrap のようなツールを使えば作業マシンは不要であり、ここから Ubuntu イメージを作ることもできます。

Ubuntu の親イメージを作るのは、以下のように簡単にできます。

$ sudo debootstrap raring raring > /dev/null
$ sudo tar -C raring -c . | docker import - raring
a29c15f1bf7a
$ docker run raring cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=13.04
DISTRIB_CODENAME=raring
DISTRIB_DESCRIPTION="Ubuntu 13.04"

Docker GitHub リポジトリには、親イメージを生成するスクリプトの例がいろいろとあります。

単純な親イメージを一から生成

Docker が規定する最小イメージ scratch は、コンテナを構築するベース・イメージとして利用できます。 scratch を利用すると「イメージ」は、``Dockerfile` `内の次に実行したいコマンドの構築プロセスに対して、最初のファイルシステムレイヤとなるように指示を出します。

Docker Hub 上の Docker リポジトリとして scratch が登場したことにより、scratch という名前を使ったイメージのアップロード、実行、タグづけはできなくなりました。 そのかわり Dockerfile 内での参照のみが可能です。 たとえば scratch を利用した最小コンテナの生成は以下のようになります。

FROM scratch
ADD hello /
CMD ["/hello"]

Docker GitHub の C ソースコード例 に示されている手順に従って、"hello" 実行モジュールの例を構築するとします。 実行モジュールは -static フラグをつけてコンパイルします。 Docker イメージは docker build --tag hello . コマンドによってビルドすることができます。

注釈

Docker Desktop for Mac と Docker Desktop for Windows では Linux VM を利用するため、Mac や Windows の実行バイナリではなく Linux の実行バイナリが必要になります。 Docker コンテナーを使って以下のようにビルドします。

$ docker run --rm -it -v $PWD:/build ubuntu:16.04
container# apt-get update && apt-get install build-essential
container# cd /build
container# gcc -o hello -static -nostartfiles hello.c

そして(Linux、Mac、Windowsにおいて) docker run --rm hello により実行します。

この例は、チュートリアルにおいて用いられている hello-world イメージを生成します。 これを試してみたい場合は、 イメージ・リポジトリ をクローンすることができます。

更なる詳細について

Dockerfile を書くにあたり、多くの情報が手助けになるでしょう。

  • Dockerfile リファレンス・セクションには、 利用可能な命令の全ガイド があります。

  • 作成した Dockerfile を、より綺麗に、読みやすく、メンテナンスしやすいように、 ベスト・プラクティス・ガイド が役立ちます。

  • もし自分で新しい公式リポジトリを作成するのが目標であれば、Docker の 公式リポジトリについて をお読みください。