Docker 빌드 캐시 전략

TMT

🚀 1. Docker는 변경점을 어떻게 감지할까?

Docker는 각 명령어(RUN, COPY, ADD 등)를 실행할 때, 해당 명령어의 입력과 결과를 **해시(Hash)**를 사용하여 추적합니다.

Docker는 다음 정보를 바탕으로 캐시의 유효성을 확인합니다.

1️⃣ Dockerfile의 명령어 (Instruction) 2️⃣ 해당 명령어의 입력 값 (Input)

COPY 또는 ADD의 경우 파일 내용과 경로 RUN의 경우 실행된 명령어 문자열 3️⃣ 이전 레이어의 ID (Parent Layer ID) 이 세 가지 정보가 이전 빌드와 정확히 일치하면 캐시를 사용합니다. 만약 어느 하나라도 변경되면 해당 레이어부터 캐시를 무효화하고 새로 빌드합니다.

예시로 살펴보겠습니다.

# dockerfile
FROM node:18
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
  1. FROM node:18 이 명령어는 캐시될 가능성이 높습니다. Docker는 node:18 이미지의 해시를 확인하고 변경이 없으면 캐시를 사용합니다.
  2. COPY package.json . 이 명령어는 package.json 파일의 내용을 기준으로 캐시 여부를 판단합니다. 2-1. 만약 package.json 파일이 변경되었다면, 이후의 모든 명령어가 다시 빌드됩니다. 2-2. 변경이 없다면 캐시가 사용됩니다.
  3. RUN npm install
    이 명령어는 package.json이 변경되지 않았다면 캐시된 결과를 사용합니다.
    그러나 package.json이 변경되었다면 npm install을 다시 실행하고 새로운 레이어를 생성합니다.
  4. COPY . . 이 명령어는 프로젝트의 모든 파일을 복사합니다. 4-1. 만약 프로젝트 디렉토리의 파일이 변경되었다면 이후 명령어들도 다시 빌드됩니다.
  5. RUN npm run build 이전 단계에서 변경이 발생했다면 이 명령어도 다시 실행됩니다.

🔍 2. 한 레이어가 변경되면 다음 레이어들은 무조건 다시 빌드되나?

✅ 네, 그 이후 레이어는 무조건 다시 빌드됩니다. Docker는 레이어가 변경되면 그 이후의 모든 레이어 캐시를 무효화하고 새로 빌드합니다.

왜 그럴까?

Docker는 각 레이어가 이전 레이어의 결과에 의존하기 때문입니다. 만약 어느 한 레이어가 변경되면 그 레이어를 기반으로 생성된 이후 레이어들이 같은 결과를 보장할 수 없기 때문에 다시 빌드해야 합니다.

📦 3. Docker가 변경점을 감지하는 주요 명령어들

명령어캐시 여부 판단 기준
FROM이미지 해시
COPY / ADD파일 경로와 파일 내용 해시
RUN명령어 문자열과 이전 레이어의 결과
ENV / ARG환경 변수 값
WORKDIR / EXPOSE / CMD 등명령어 문자열

💡 4. 캐시 무효화를 강제로 트리거하는 방법

Docker 빌드 시 특정 레이어를 무조건 새로 빌드하고 싶다면, --no-cache 옵션을 사용할 수 있습니다.

docker build --no-cache -t my-image .

이렇게 하면 Docker는 모든 명령어를 캐시 없이 새로 빌드합니다.

✅ 5. 실무 팁: Dockerfile 작성 시 캐시 전략 최적화

Docker 빌드 속도를 최적화하려면 캐시 전략을 고려한 Dockerfile 작성이 중요합니다.

1️⃣ 변경이 자주 일어나는 파일은 나중에 COPY

  • COPY package.json .과 같이 변경이 적은 파일을 먼저 복사하고, 나머지 파일을 나중에 복사합니다.
  • 이렇게 하면 npm install과 같은 무거운 명령어를 덜 자주 다시 실행할 수 있습니다.

2️⃣ RUN 명령어를 하나로 합치기

  • 여러 개의 RUN 명령어를 하나로 합쳐서 레이어 수를 줄일 수 있습니다.
# Before
RUN apt-get update
RUN apt-get install -y curl

# After
RUN apt-get update && apt-get install -y curl

3️⃣ 빈번히 변경되는 환경 변수는 나중에 설정

  • ENV 명령어는 캐시를 무효화하므로 나중에 설정하는 것이 좋습니다.

🎯 정리

  • Docker는 명령어, 입력 값, 이전 레이어의 결과를 바탕으로 캐시 여부를 결정합니다.
  • 어느 한 레이어가 변경되면 그 이후의 모든 레이어는 무조건 다시 빌드됩니다.
  • Dockerfile을 최적화하면 빌드 속도를 크게 개선할 수 있습니다.
  • 캐시 무효화가 필요하면 --no-cache 옵션을 사용할 수 있습니다.
Edit this page