Docker Multi Stage
์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๋ฉด์ ๋น๋ ๋ฑ์๋ ํ์ํ์ง๋ง ์ต์ข ์ปจํ ์ด๋ ์ด๋ฏธ์ง์๋ ํ์ ์๋ ํ๊ฒฝ์ ์ ๊ฑฐํ ์ ์๋๋ก ๋จ๊ณ๋ฅผ ๋๋์ด์ ๊ธฐ๋ฐ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
Background
- Docker๊ฐ ๋ฑ์ฅํ ์ดํ Docker Image๋ฅผ ์๊ฒ ๋ง๋ค๊ธฐ ์ํ ๋
ธ๋ ฅ๋ค์ด ์์์ต๋๋ค.
- Image๊ฐ ์์ผ๋ฉด ์์ ์๋ก ๋น๋, ๋ฐฐํฌ ์๊ฐ์ด ์งง์ ์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๊ฐ๊ฐ์ Instruction๋ค์ Dockerfile ํ๋์ Layer๋ก ์ถ๊ฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๊ฐ์ง ์ต์ ํ๊ฐ ํ์ํ์ต๋๋ค.
- Docker Image๋ฅผ ๊ฐ๋ณ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋์จ ๋ฐฉ๋ฒ์ด Multi Stage ๋ฐฉ์์ ๋๋ค.
Multi Stage Build ๋ฐฉ์์ด ๋์ค๊ธฐ ์ ์
-
builder-pattern์ ํ์ฉํ์ต๋๋ค.
- ํ๋์ Dockerfile์ด ์๋ ๋ ๊ฐ์ง์ Dockerfile์ ์ ์งํ๋ ๊ฒ์ ๋๋ค.
-
Dockerfile.build
- ์ฌ๋ฌ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ ๋ฐ ๋ถ๋ฆฌํ์ง ์๊ณ
&&
\
๋ฅผ ํตํด ํ๋์ Layer์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. - ๋น๋๋ฅผ ์ํ ์ด๋ฏธ์ง ์ ๋๋ค.
- ์ฌ๋ฌ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ ๋ฐ ๋ถ๋ฆฌํ์ง ์๊ณ
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 \ -> ํ๋์ Layer์์ ๋ช
๋ น์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ต์ ํ
&& 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
- Multi stage๋ฅผ ์ง์ํ๊ธฐ ์ ์๋ ์ด๋ ๊ฒ ๋ฐ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ผ ํ์ต๋๋ค.
#!/bin/sh
echo Building alexellis2/href-counter:build
# build image
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
# run app
docker build --no-cache -t alexellis2/href-counter:latest .
rm ./app
Multi Stage๊ฐ ๋ฑ์ฅํ๋ฉด์
- ํ๋์ Dockerfile๋ก ๋น๋ ์ด๋ฏธ์ง์ ์คํ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฆฌํ ์ ์๊ฒ ๋์ด ํจ์ฌ ๊ฐํธํ๊ฒ ์ด๋ฏธ์ง๋ฅผ ์ค์ผ ์ ์๊ฒ ๋์์ต๋๋ค.
- ๋ฟ๋ง ์๋๋ผ ๋ฐฐํฌ ์ด๋ฏธ์ง์ ์ฉ๋์ด ์ค์ด ๋น๋ ์๊ฐ์ด ๊ฐ์ํ๊ฒ ๋์์ต๋๋ค.
FROM golang:1.7.3 AS builder
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=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]