Docker multi stage build


Docker 17.05で導入される「Docker multi stage build」はの紹介です。「Docker multi stage build」を使うとビルド依存のライブラリと、ランタイム(プログラムの実行)依存のライブラリとを分離することで、Dockerイメージのサイズを大幅に削減できます。

🐞 Docker Imageのサイズを比較

次のDockefileは、Golangのサンプルプログラムをビルドした後に、
ランタイム(実行)依存のイメージを作成しています。

# ビルド依存のライブラリ
# 中間イメージに`build-env`という名前をつける
FROM golang:alpine AS build-env
ADD . /work
WORKDIR /work
RUN go build -o hello main.go
# ランタイム(実行)依存のライブラリ
FROM busybox
# `build-env`からコンパイルしたデータをコピー
COPY --from=build-env /work/hello /usr/local/bin/hello
ENTRYPOINT /usr/local/bin/hello

サンプルで実行するmain.goは次のとおりです。

package main
import fmt
func main() {
fmt.Println(Hello World!)
}

上記のDockerfileをbuildして、main.goを実行します。

# Dockerfileのbuild
docker build -t hello ./
# 作成したDockerイメージを実行
docker run -it --rm hello
#=> Hello World!

実行できたので、実際に作成されたイメージを確認します。

hello latest 2b9b795f4c68 25 seconds ago 2.66MB
<none> <none> 2507b236dfd3 30 seconds ago 258MB
<none> <none> 2b306ea7388a About a minute ago 257MB
golang alpine c82f63bb2928 11 days ago 257MB
busybox latest 00f017a8c2a6 5 weeks ago 1.11MB

コンパイルしたgolang:alpineが257MBなのに対して、実行に必要なhelloイメージが2.66MBとなり、サイズがかなり小さくなったことがわかります。

🎃 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍