コンテナイメージを小さくするメリット
- パフォーマンス
- イメージビルドの時間短縮
- レジストリの容量節約
- セキュリティ (このへんはよくわかってない)
- 余計なモジュールを入れない
- GCPの公式 が言うにはバグが潜む原因になるそう
小さくするための方法
- 小さいベースイメージを利用
- Alpine Linux など
- ビルドパターン
- マルチステージビルド
- ビルドで使うコンテナと最終的な実行可能ファイルだけを詰め込んだコンテナを分られる
マルチステージビルド
マルチステージビルドは、バージョン17.05 からサポートされたDockerの機能となります。 通常のDockerfileでは以下のように定義します。
FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
COPY app.go .
RUN go get -d -v golang.org/x/net/html \
&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
マルチステージビルドを利用すると以下のように記述できます。
FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
試してみる
FFMpegのコンテナイメージを作成する場合を試す。 前提としてベースイメージは Amazon Linux を利用する。
結果
- 通常のビルドの場合
- 2.27GB
- マルチステージビルドの場合
- 731MB
通常のビルドに比べ約 32% まで小さくなりました。
最後に
マルチビルドを 利用することで、影響範囲を分けられるのでビルドキャッシュが有効的に利用できます。 難点としては none イメージが大量にできてしまうことでしょうか。
参考
高橋克幸
新卒3年目で脱新人を目指してます。
フロントに興味を持ち始めた今日このごろ。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。