# マルチステージビルドの活用 ## マルチステージビルドとは マルチステージビルドでは、Dockerfile内にFROM行を複数記述する。 各FROM命令のベースイメージは、それぞれに異なるものとなり、各命令から新しいビルドステージが開始される。 ## 以前はどうしていたか Dockerfileを作成する際、一般的にはレイヤ数を最小にすることを目指す。 例えば、開発用Dockerfileはアプリケーションビルドに必要な要素を含め、本番用Dockerfileはアプリケーション実行に必要な要素のみを含むなど。 *Dockerfile.build* ```dockerfile= FROM golang:1.16 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 . ``` *Dockerfile* ```dockerfile= FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY app ./ CMD ["./app"] ``` *build.sh* ```bash= echo Building alexellis2/href-counter:build docker build --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy \ -t alexellis2/href-counter:build . -f Dockerfile.build docker container create --name extract alexellis2/href-counter:build docker container cp extract:/go/src/github.com/alexellis/href-counter/app ./app docker container rm -f extract echo Building alexellis2/href-counter:latest docker build --no-cache -t alexellis2/href-counter:latest . rm ./app ``` build.shスクリプトを実行すると、1つ目のイメージがビルドされる。 そこからコンテナーを生成してイメージ内容をコピーし、2つ目のイメージがビルドされる。 2つのイメージはサイズも小さくなく、ローカルディスク上にappの生成物も残ったままとなる。 ## マルチステージビルドを活用すると何が嬉しいか マルチステージビルドでは、Dockerfileで複数回FROM命令を記述できる。 そして各FROM命令毎に異なるベースイメージを使用することができる。 また、前にビルドしたステージに名前をつけ、参照して利用することができる。 ```dockerfile= FROM alpine:latest AS builder RUN apk --no-cache add build-base FROM builder AS build1 COPY source1.cpp source.cpp RUN g++ -o /binary source.cpp FROM builder AS build2 COPY source2.cpp source.cpp RUN g++ -o /binary source.cpp ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up