ベースイメージの生成
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
の書き方については、他にも多く触れています。
- リファレンスには
Dockerfile
にて利用可能な 全コマンドのガイド があります。 Dockerfile
をわかりやすく読みやすく、保守がしやすくするように、Dockerfile
ベストプラクティス も記述しています。- 公式イメージを作ることが目的であれば Docker 公式イメージ を確認してください。