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
FROM node:18
이 명령어는 캐시될 가능성이 높습니다. Docker는 node:18 이미지의 해시를 확인하고 변경이 없으면 캐시를 사용합니다.COPY package.json .
이 명령어는 package.json 파일의 내용을 기준으로 캐시 여부를 판단합니다. 2-1. 만약 package.json 파일이 변경되었다면, 이후의 모든 명령어가 다시 빌드됩니다. 2-2. 변경이 없다면 캐시가 사용됩니다.RUN npm install
이 명령어는 package.json이 변경되지 않았다면 캐시된 결과를 사용합니다.
그러나 package.json이 변경되었다면 npm install을 다시 실행하고 새로운 레이어를 생성합니다.COPY . .
이 명령어는 프로젝트의 모든 파일을 복사합니다. 4-1. 만약 프로젝트 디렉토리의 파일이 변경되었다면 이후 명령어들도 다시 빌드됩니다.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 옵션을 사용할 수 있습니다.