ベース イメージの作成

ほとんどの Dockerfile は 親イメージ(parent image) を元にしています。イメージの内容を完全に管理する必要があれば、ベース イメージ(base image) の代わりになるものを作成する必要があります。これがその違いです:

  • 親イメージ はイメージの土台(ベース)となるイメージです。 Dockerfile の FROM 命令で内容を指定します。 Dockerfile で以降に続く命令では、この親イメージに対して変更を加えます。ほとんどの Dockerfile はベース イメージではなく、何らかの親イメージからスタートします。しかし、これらの用語は同じ意味で使用されることもあります。

  • ベース イメージ は Dockerfile の中で FROM scratch の指定があります。

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

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

一般的に、親イメージとしてパッケージしたいディストリビューションが動作しているマシンから始めます。しかし、この作業は Debian の Debootstrap のようなツールを用いる場合は不要であり、Ubuntu イメージの構築にあたっても同様です。

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

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

sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3

$ docker run focal cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"

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

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

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

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

# syntax=docker/dockerfile:1
FROM scratch
ADD hello /
CMD ["/hello"]

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

docker build --tag hello .

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

注釈

Docker Desktop for Mac と Docker Desktop for Windows は Linux 仮想マシンを使いますので、Linux バイナリが必要です。Mac や Windows に対応したバイナリではありません。Docker コンテナを使って、次のようにして構築できます。

$ docker run --rm -it -v $PWD:/build ubuntu:20.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 の 公式イメージ にある記述をご覧ください。