普段docker-compose以外使わないのにDockerの情報を追っていないので最近知った…
やってみるととても簡単にdockerイメージの軽量化が出来た
マルチステージビルドとは
イメージの軽量化が簡単になる、実行用イメージのビルドが複雑にならない
こんな感じで捉えてる
どう使うのか
FROMを複数回記述して、ステージを分ける
段階を踏んで書こうかと思ったけど簡単なので最終的なDockerfileを載せる
その前に各段階のイメージサイズ
multistagebuild 1.0.2 449a87da267a 32 minutes ago 5.53MB // マルチステージビルド
multistagebuild 1.0.1 90ff9debf4c2 35 minutes ago 29.4MB // apk addで色々入れてるマルチステージビルド無し
multistagebuild 1.0.0 8381b349a14f 40 minutes ago 5.53MB // alpine:3.9.3そのまま
1.0.0
はalpineをFROMで指定しただけのままでビルド
1.0.1
はalpine+apk addで色々入れたやつ
1.0.2
はalpine+apk addで色々入れてるのをビルドステージに指定して、実行コンテナをマルチステージビルドで指定 1ファイル追加してるだけなので1.0.0
と同じサイズ(数KB増えてるはず)
マルチステージビルドを使ったDockerfile
ビルドステージで生成したファイルを実行用イメージにコピーしてその中身をcatするだけの実行イメージを作成
Dockerfile
# ビルドステージ
FROM alpine:3.9.3 AS build_stage
RUN apk update && apk add openssh && apk add curl
RUN apk add git
RUN apk add htop
WORKDIR /tmp
RUN touch ttt.txt
RUN echo "multistagebuild copy from build_stage" >> ttt.txt
# 実行用イメージ
FROM alpine:3.9.3
WORKDIR /app
COPY --from=build_stage /tmp/ttt.txt /app/ttt_cp.txt
CMD ["cat", "/app/ttt_cp.txt"]
生成されたイメージを実行してみる
docker run --rm -it --name multistagebuild multistagebuild:1.0.2
> multistagebuild copy from build_stage
で、でたぁ〜
はい。
まとめ
FROMだけで出来るなんてお前は何て優しいやつなんだ…
ビルドステージという単語を使ってるがそんな言葉があるか知らん、雰囲気で使っている