Golang Docker build 시 dependency 캐싱되도록 하기(부제: 도커 빌드때 매번 go get 안할 수 있는 방법)

Keunjae Song·2021년 3월 23일
0

golang

목록 보기
1/1

docker는 캐싱을 지원하기 때문에 Dockerfile 커맨드 순서를 잘 작성한다면 보다 빠르게 빌드할 수 있습니다.

그러나 golang으로 개발을 하면서 분명히 소스 코드 파일만 수정했는데,
매번 docker build를 할 때마다 디펜던시를 새로 처음부터 받아오는 것을 경험했습니다.

이 때문에 코드를 조금만 수정해도 docker build에 꽤 많은 시간이 걸리고 디펜던시를 다운로드할 때까지 가만히 기다리는 수밖에 없었습니다.

한 두번 정도는 그러려니 했는데, 최근 들어 이 작업을 기다리기에는 너무 제가 참을성이 부족해서 방법을 찾게 되었습니다.

해결 방법

기존 golang 프로젝트 Dockerfile

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 # <- 여기서 항상 병목이 걸립니다.

수정된 golang 프로젝트 Dockerfile

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합니다.

이제부터 디펜던시들이 캐싱되면서 다음 빌드부터는 디펜던시들을 매번 새로 받아오지 않습니다.

Reference

0개의 댓글