logoRawon_Log
홈블로그소개

Built with Next.js, Bun, Tailwind CSS and Shadcn/UI

Docker

Docker - 캐싱을 활용한 빌드

Rawon
2025년 9월 29일
목차
캐싱을 활용한 빌드

목차

캐싱을 활용한 빌드

캐싱을 활용한 빌드

캐시는 시간이 걸리는 작업의 결과물을 미리 저장해두고 동일한 작업이 발생했을 때 다시 계산하지 않고 결과를 빠르게 제공해주는 기술입니다.

아래는 Node.js 애플리케이션을 빌드하는 도커 파일 입니다.

docker
FROM node:14

WORKDIR /usr/src/app

COPY . .

RUN npm ci

RUN npm run build

CMD ["npm", "start"]

이 Dockerfile은 Node 14버전을 베이스 이미지로 시작하고 workdir 지시어를 사용해서 새로운 폴더를 생성했습니다.

그리고 copy 지시어를 사용해서 빌드 컨텍스트의 소스코드를 복사한 후 빌드에 필요한 외부 라이브러리를 run 명령어를 통해 설치합니다.

마지막으로 npm run build 명령어로 소스 코드를 애플리케이션으로 만드는 빌드 명령어를 수행합니다.

이와 같은 지시어의 순서대로 이미지의 레이어가 쌓이게 되고 각각 하나의 레이어들로 추가되어서 Docker build 명령어 실행 시 결과적으로 총 4개의 이미지 레이어를 추가하는 것 입니다.

💡 npm run build ——— 애플리케이션 빌드
npm ci ——— 외부 라이브러리 설치

소스코드 복사 ——— 전체 소스코드 복사

디렉터리 변경

node:14

이 과정에서 각각의 레이어들은 Docker가 캐시 로 저장해둡니다.

그리고 다음 빌드에서 동일한 지시어를 사용하면 이미지 레이어를 새롭게 만들지 않고 캐시에 저장되어 있는 레이어를 그대로 사용할 수 있습니다.

Docker는 지시어를 똑같이 작성한 경우에 캐시에 저장되어 있는 레이어를 그대로 사용하는데,

물론 지시어만 같으면 캐시를 무조건 사용하는 것이 아니라 지시어로 처리하는 내용까지 같아야 합니다.

COPY, ADD 명령의 경우 빌드 컨텍스트의 파일 내용이 변경되는 것. 즉, 지시어의 대상이 되는 소스 코드의 내용이 변경되면 캐시를 사용하지 않습니다.

만약 위 Dockerfile에서 COPY 지시어의 대상이 되는 빌드 컨텍스트의 소스 코드에 변경이 있고 다시 이미지를 빌드한다면 캐시를 사용하지 않습니다.

그리고 레이어는 이전 레이어가 변경된 경우 이후 모든 레이어는 캐시를 사용하지 않고 새로운 레이어가 만들어집니다.


그러면 이미지 빌드에서 캐싱을 활용하는 방법에 대해 알아보겠습니다.

레이어는 순차적으로 쌓이고 이전 레이어가 변경되면 다음 레이어도 같이 변경되기 때문에 잘 변경되지 않는 레이어들을 아래 레이어들로 배치하면 캐시를 활용하는 빈도를 높일 수 있습니다.

애플리케이션 빌드 시 보통 외부 라이브러리를 다운받는 과정에서 많은 시간을 소모하는데, 일반적으로 애플리케이션이 사용하는 라이브러리의 정보가 변경되는 케이스가 많지 않고 실제로 기능이 추가되는 소스의 변경이 빈번히 이루어 집니다.

이러한 정보를 바탕으로 캐싱을 활용한 Dockerfile의 예시는 아래와 같습니다.

이와 같이 라이브러리를 설치하는 부분을 따로 분리하면 캐시를 활용해서 빌드 속도를 높일 수 있습니다.

docker
FROM node:14

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm ci

COPY . .

RUN npm run build

CMD ["npm", "start"]

어떤 식으로 빌드가 이루어지는지 자세히 보면

애플리케이션 빌드를 실행하기 전에 COPY로 package.json 파일만 따로 복사해온 뒤, 이 파일을 사용해서 의존 라이브러리를 설치합니다.

그리고 난 후 전체 소스 코드를 복사해온 다음 애플리케이션 빌드를 실행합니다.

이 경우에는 package.json 파일이 변경되지 않는다면 npm ci 까지의 레이어는 캐시를 활용할 수 있습니다.

이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗

https://inf.run/CigvZ