ベースイメージの生成

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

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

  • ベースイメージ は Dockerfile においてFROM scratchに記述されるものです。

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

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 レポジトリ には、親イメージを生成するスクリプトの例がいろいろとあります。

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

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

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 .

.の文字を最後につけるのを忘れないでください。 これはビルドコンテキストをカレントディレクトリに設定するものです。

メモ

Docker Desktop for Mac と Docker Desktop for Windows では Linux VM を利用するため、Mac や Windows の実行バイナリではなく Linux の実行バイナリが必要になります。 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 hello.c

新イメージはdocker runコマンドを使って実行します。

$ docker run --rm hello

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

その他の情報

Dockerfileの書き方については、他にも多く触れています。

images, base image, examples