Docker の軽量なイメージを探していたら tianon/sleeping-beauty を見つけたので記事に。
せっかくなので tianon/true も含めて説明。
scratch
Docker で最も軽量なのは scratch で、これはイメージというよりも『何も入っていない』全く空の状態のイメージを指すキーワード。
一切のバイナリが含まれていないため、
docker run scratch
Unable to find image 'scratch:latest' locally
docker: Error response from daemon: 'scratch' is a reserved name.
See 'docker run --help'.
と実行しても起動することができない。
全く新しい Docker Image を作るときには scratch を元に作ると軽量なイメージになる。
FROM scratch
ADD somefile /
CMD /somefile
(この例の somefile の場合、単一バイナリで起動できるように静的リンクにビルドする必要がある。)
Golang では簡単に単一バイナリのプログラムが作れるので、いろいろと試してみると楽しそう。
tianon/true
Unix コマンドの true のように、実行して終了コード 0 で終了 (成功) するだけのエントリポイントが設定されたイメージ。
Docker Hub によると perfect for volume-only containers と書いてある。
FROM tianon/true
VOLUME /path/to/somedata
のように volume だけを持つ空のコンテナが欲しい時に使うと良い。
ちなみにアセンブラで書いてあり、バイナリはわずか 125 bytes のサイズしかない。
驚くほどシンプルな NASM のコードなので、勉強のために読んで見るのも良いと思う。
ところが
このコンテナは docker rm コマンドを使用した場合に、やすやすと消されてしまう。
既に終了してしまっているからだ。
「Docker のいらないイメージを削除する」 Docker イメージがあるって で書いた docker-gc でも無慈悲に削除されてしまう。
tianon/sleeping-beauty
tianon/true は、起動した直後に終了してしまうが、 sleeping-beauty はそうではない。
例えて言うなれば sleep 無限 を実行するような Docker イメージである。
起動してさえいれば docker-gc で消されることもない。
こちらもわずか 129 bytes のサイズだ。
こちらのソースも単純明快だ。
ちなみに英語で Sleeping Beauty といえば、『眠れる森の美女』のこと。オシャレなネーミングだ。
まとめ
| 名前 | サイズ | 向いている用途 (私の主観) |
|---|---|---|
| scratch | - | 新しい軽量コンテナを作りたい |
| tianon/true | 125 B | Volume だけのコンテナを作りたい (起動してなくていい) |
| tianon/sleeping-beauty | 129 B | Volume だけのコンテナを作りたい (起動している必要あり) |
| busybox | 1.113 MB | BusyBox のコマンド さえ使えればいい時 |
| gliderlabs/alpine | 4.798 MB | 多種多様なパッケージ が要る時 |
※ サイズは 2016 年 4 月 12 日現在のもの。