ベース・イメージの作成

ほとんどの Dockerfile は親イメージ(parent image)から始まります。イメージの内容を完全にコントロールする必要があれば、ベース・イメージの代わりになるものを作成する必要があります。これがその違いです:

  • 親イメージ はイメージの土台(ベース)となるイメージです。 Dockerfile の FROM 命令で内容を指定します。 Dockerfile で以降に続く命令では、この親イメージに対して変更を加えます。ほとんどの Dockerfile はベース・イメージではなく、何らかの親イメージからスタートします。しかしながら、ほとんどが用途はとして置き換え可能です。
  • ベース・イメージ は Dockerfile の中で FROM scratch の指定があります。

このトピックではベース・イメージの作成方法をいくつか紹介します。特定の手順では、パッケージが必要となるため特定の Linux ディストリビューションに強く依存します。以下でいくつかの例を示しますが、新しい例を pull request を通して貢献いただくことも歓迎します。

tar を使ってイメージ全体を作成

一般的に、マシンを作り始めるときは、実行したいパッケージを含むディストリビューションが親イメージの中に入っています。そのため、 Debian の Debootstrap のようなツールは不要であり、Ubuntu イメージの構築にあたっても同様です。

この Ubuntu 親イメージの作成は、シンプルにできます。

$ sudo debootstrap xenial xenial > /dev/null
$ sudo tar -C xenial -c . | docker import - xenial

a29c15f1bf7a

$ docker run xenial cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"

Docker Github リポジトリには、親イメージを作成するためのサンプルスクリプトがあります。

scratch を使ってシンプルな親イメージを作成

コンテナ構築用のスタート地点ととして、Docker で確保している最小イメージ、 scratch を利用できます。 scratch 「イメージ」を使うと、構築プロセスは Dockerfile の次の命令から始まることとなり、これがイメージの1番目のファイルシステム・レイヤになります。

Docker Hub の Docker リポジトリに scratch 命令が出てきても、 scratch という名前でイメージの取得・送信・実行・タグ付けはできません。そのかわり、 Dockerfile の中から参照できるものです。たとえば、最も小さなコンテナを scratch を使って作成するには、次のようになります。

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

https://github.com/docker-library/hello-world/ にある命令を使って、「hello」を実行する例を考えましょう。この時、 -static フラグを付けてコンパイルしているとします。これを使って Docker イメージを構築する docker build は、次のようになります。

docker build --tag hello .

最後に . 記号を付けるのを忘れないでください。これは、現在のディレクトリをビルド・コンテクストとして指定します。

注釈

Docker Desktop for Mac と Docker Desktop for Windows は Linux 仮想マシンを使いますので、Linux バイナリが必要です。Mac や Windows に対応したバイナリではありません。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

新しいイメージを実行するには、 docker run コマンドを実行します。

docker run --rm hello

この例ではチュートリアルにある hello-world イメージから作成したものです。自分自身で検証したい場合は、 イメージのリポジトリ をクローンできます。

更なる情報

Dockerfile を書くのに役立つ沢山の情報があります。

  • Dockerfile のリファレンス・セクションでは、 全ての命令に対する完全なガイド があります。
  • 明確で読みやすくメンテナンスのしやすい Dockerfile を書くには、こちらにある ベストプラクティス・ガイド が役立つでしょう。
  • あなたの目標が何らかの新しい公式イメージの作成であれば、 Docker の 公式イメージ にある記述をご覧ください。