docker는 캐싱을 지원하기 때문에 Dockerfile 커맨드 순서를 잘 작성한다면 보다 빠르게 빌드할 수 있습니다.
그러나 golang으로 개발을 하면서 분명히 소스 코드 파일만 수정했는데,
매번 docker build를 할 때마다 디펜던시를 새로 처음부터 받아오는 것을 경험했습니다.
이 때문에 코드를 조금만 수정해도 docker build에 꽤 많은 시간이 걸리고 디펜던시를 다운로드할 때까지 가만히 기다리는 수밖에 없었습니다.
한 두번 정도는 그러려니 했는데, 최근 들어 이 작업을 기다리기에는 너무 제가 참을성이 부족해서 방법을 찾게 되었습니다.
FROM golang:alpine AS build-env
# do some
# ...
# 프로젝트 파일 복사
WORKDIR /usr/src/app
COPY . /usr/src/app
# 매번 새로운 디펜던시 download && build
RUN go build -o /usr/bin/hello # <- 여기서 항상 병목이 걸립니다.
FROM golang:alpine AS build-env
# do some
# ...
# 프로젝트 파일 중 go.mod, go.sum 먼저 복사 후 go mod download
WORKDIR /usr/src/app
COPY go.mod /usr/src/app
COPY go.sum /usr/src/app
RUN go mod download
# 프로젝트 폴더 복사 후 build
COPY . /usr/src/app
RUN go build -o /usr/bin/hello # <- 이제 매번 디펜던시를 받아오지 않습니다.
위 dockerfile처럼
1. go.mod, go.sum을 먼저 copy합니다.
2. go mod download를 합니다.
3. 이제 프로젝트 폴더를 복사한 후 build합니다.
이제부터 디펜던시들이 캐싱되면서 다음 빌드부터는 디펜던시들을 매번 새로 받아오지 않습니다.