Dockerのimageを作るときにAlpineを使ってイメージサイズを小さくしてるよ!
なんて記事をたくさん見かけますが、チャンチャラおかしいですね。
まず下の実行結果を見てください。
ubuntu@instance-1:~$ docker run -t --rm hello:alpine /hello
hello, world
ubuntu@instance-1:~$ docker run -t --rm hello:empty /hello
hello, world
hello:alpine
、hello:empty
ともに/hello
が同じように動いてますね?
名前から分かる通りhello:alpine
はAlpineをベースにして作成したイメージです。
では、Imageのサイズを比較してみましょう。
ubuntu@instance-1:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello empty d2a601785ec8 2 minutes ago 3.12MB
hello alpine b8765dbaee21 3 minutes ago 7.08MB
hello:alpine
のサイズは 倍以上 ですよ先生。
Alpineは 重い ですねぇ...
さて、じゃあhello:emtpy
はどう作っているのか。
の前にhello:alpine
の作り方を見てみましょう。
FROM alpine:latest
MAINTAINER Yuuichi Fujioka
ADD hello hello
CMD ["/hello"]
普通に Alpineのイメージにhello
を追加しているだけですね。よく見るやつです。
次にhello:empty
の作り方です。
FROM fujioka/empty:latest
MAINTAINER Yuuichi Fujioka
ADD hello hello
CMD ["/hello"]
hello:alpine
との差はベースイメージのみで、こちらはfujioka/empty:latest
を元にして作っているのです。
では、このfujioka/empty:latest
のサイズは...
ubuntu@instance-1:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fujioka/empty latest 00de6c8c6d46 28 hours ago 0B
0 Byte!!!!
ベースイメージが軽いので、それを元にして作ったhello:empty
も軽いのですね。
fujioka/empty
には何も入っていないので、単純にhello
の分しか容量を食わないのです。
なぜhello
しか入っていないイメージが動くのか?
それは実に単純な話で、hello
がただの一つも外部ライブラリに依存していない、このファイル単一で実行可能なファイルだからなのです。
ubuntu@instance-1:~$ ldd hello
not a dynamic executable
わかりましたか?Alpineなんてなくても動くイメージは作れるのです。
あなたはまだAlpineを使ってるんですか?
備考1:
このイメージの作り方だと起動中のコンテナの中でデバック等はできません。だってshも入ってないんですもの。
備考2
fujioka/empty
の作り方はとっても簡単です。
ubuntu@instance-1:~$ mkdir empty
ubuntu@instance-1:~$ cd empty/
ubuntu@instance-1:~/empty$ tar cvf ../empty.tar .
./
ubuntu@instance-1:~/empty$ docker import ../empty.tar fujioka/empty:latest
sha256:b88d22f5420364288768c3ff7d70c4529afa87d2a15735cc8a41c8a2fb05d853
どこの誰かわからない人名が入ったイメージを使いたくない方は、自分で作っちゃえばいいと思います。
備考3:
どうでもいいですが、今回使ったhello
はGo言語で作ったものです。
https://github.com/yuuichi-fujioka/hello-world
シングルバイナリで動的ライブラリを使わない実行形式のファイルが簡単にできていいですね、Go。
hello:empty
って、ベースイメージを別に作らないでFROM scratch
でできませんか?あと、デバッグをしたいときなどにはAlpine Linuxはまだ有効でしょうか?
できるだけ煽る感じで qiita に記事書こうぜって煽って正直スマンカッタ。
docker scratch
でググると 2014 年くらいにたくさん記事がヒットするね。