ベース・イメージの作成¶
ほとんどの 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 リポジトリには、親イメージを作成するためのサンプルスクリプトがあります。
- BusyBox
- Debian / Ubuntu 上の あるいは CentOS / RHEL / SLC 等での上の CentOS / Scientific Linux CERN (SLC)
- Debian / Ubuntu
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 の 公式イメージ にある記述をご覧ください。
参考
- Create a base image
- https://docs.docker.com/develop/develop-images/baseimages/