오늘도 한 뼘 더

[TIL] Multi-Stage Build(Dockerfile) 본문

DevOps & Infra/TIL(Today I Learned)

[TIL] Multi-Stage Build(Dockerfile)

나른한댕댕이🐶 2022. 1. 16. 19:42
728x90
반응형

  # 배경  

회사에서 Docker 업무를 하면서 로컬에서 golang 서비스를 Docker로 만드는 걸 진행했는데 잘 되지 않는 문제가 발생을 했고 시니어 분께서 Dockerfile을 봐주시면서 Multi-Stage Build라는 것을 알아보라고 하셨다. 

 

  # Multi-Stage Build  

- Docker 이미지를 만들 때 Dockerfile을 사용하는데 이때, 이미지를 만드는 방식이 layer를 쌓는 방식이다.

- multi-stage builds는 여러개의 "FROM"을 작성하여 하나의 Dockerfile에서 새로운 빌드 스테이지를 시작할 수 있게끔 한다.

- 필요한 소스들만 COPY를 해서 사용함으로써 도커 이미지의 용량도 줄어드는 효과가 나타난다. 

 

  # Multi-Stage Build 적용 전  

- 시니어 분의 popit.kr 글과 Docker 홈페이지의 문서를 보고 작성한 multi-stage 적용 전의 Dockerfile

  FROM golang:1.15.6 AS builder
  WORKDIR /go/src/platform-service

  ADD . /go/src/platform-service

  RUN go mod download
  RUN go install -ldflags '-w -extldflags "-static"'

  EXPOSE 9000
  CMD ["./platform-service"]

 

- 도커이미지 용량

 

 

  # Multi-Stage Build 적용 후  

- Dockerfile

  FROM golang:1.15.6 AS builder
  WORKDIR /go/src/platform-service
  COPY . .
  # disable cgo
  # ENV CGO_ENABLED=0
  RUN go mod download
  RUN go install -ldflags '-w -extldflags "-static"'

  # make application docker image use alpine
  FROM alpine:3.10
  # using timezone
  ARG DEBIAN_FRONTEND=noninteractive
  ENV TZ=Asia/Seoul
  RUN apk add -U tzdata

  WORKDIR /go/bin/
  # copy config files to image
  COPY --from=builder /go/src/platform-service/config/*.json ./config/
  # copy execute file to image
  COPY --from=builder /go/bin/platform-service .
  #EXPOSE 9000
  CMD ["./platform-service"]

 

- 도커이미지 용량


참고자료

https://www.popit.kr/커머스-코드-자산화-개발일지-4-출시/
https://docs.docker.com/develop/develop-images/multistage-build/
728x90
반응형
Comments