あなたまだAlpineを使ってるんですか?

  • 8
    Like
  • 2
    Comment

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:alpinehello: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。

227contribution

hello:emptyって、ベースイメージを別に作らないでFROM scratchでできませんか?

あと、デバッグをしたいときなどにはAlpine Linuxはまだ有効でしょうか?

1contribution

できるだけ煽る感じで qiita に記事書こうぜって煽って正直スマンカッタ。
docker scratch でググると 2014 年くらいにたくさん記事がヒットするね。