9
10

More than 5 years have passed since last update.

今更ながらDocker マルチステージビルド

Posted at

普段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だけで出来るなんてお前は何て優しいやつなんだ…
ビルドステージという単語を使ってるがそんな言葉があるか知らん、雰囲気で使っている

参考

Docker docs - Use multi-stage builds

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10