[Docker] Docker Image Cache

1 분 소요

Docker 강의를 들으면서 이미지 Cache 기능에 대한 정리.

결론

  • Docker는 Dockerfile 내 명령어 별로 Cache를 가진다.
  • Library 설치 작업은 Dockerfile 상단에 지정하자.

궁금증

강의를 진행하면서 궁금한 점이 생겼다. 강의는 frontend는 react, backend는 node를 사용한다. backend의 node는 기존 아래와 같은 Dockerfile을 가진다.

FROM node:10

COPY ./ ./

RUN npm install

하지만 아래와 같이 Dockerfile을 바꾸면 도커가 npm install 재빌드 문제가 해결할 수 있다고 한다.

FROM node:10

COPY package.json ./

RUN npm install

COPY ./ ./

그런데 아직 부족한 내 눈에는 COPY ./ ./COPY package.json ./ 결과 차이가 없었다. 왜 재빌드 문제를 해결해주는 것일까?

실험

나의 가설은 이렇다.

  1. 소스에 변화가 없다면 build를 2번하지 않는다.
  2. 강의에서 말하는 재빌드는 npm의 재빌드가 아니라, Docker 이미지 재빌드다.

기존 Dockerfile 실험

기존 Dockerfile로 아래와 같이 Test 했다. 두 작업의 Cache 여부를 비교해본다.

  1. 소스 변경 없이 재빌드
  2. 소스 수정 후 다시 빌드

첫 번째, 소스 변경 없이 재빌드다. Cache 한 이미지를 그대로 가져온다.

그림 1

두번째, 소스 수정 후 다시 빌드다. 종속성 추가 작업이 없는데, npm install 작업은 Cache를 사용하지 않고 다시 실행한다.

그림 1

변경 Dockerfile 실험

변경 Dockerfile로 아래와 같이 Test 했다. 두 작업의 Cache 여부를 비교해본다.

  1. 소스 변경 없이 재빌드
  2. 소스 수정 후 다시 빌드

첫 번째, 소스 변경 없이 재빌드다. Cache 이미지를 그대로 가져온다.

그림 1

두 번째, 소스 수정 후 다시 빌드다. Cache 이미지를 그대로 사용한다.

그림 1

정리

차이점은 RUN npm install의 cache 여부에 있다.

  소스 수정 없이 Build 소스 수정 후 Build
기존 Dockerfile O X
변경 Dockerfile O O

정리하면, 명령어의 순서는 Docker 빌드에 영향을 준다. 기존 Dockerfile은 소스에 변경이 발생하면, COPY ./ ./ 가 아래에 있는 명령어 Cache들은 버린다. 그래서 RUN npm install 은 종속성을 다시 다운받아 Build를 진행한다.

하지만 변경 Dockerfile은 소스에 변경이 발생해도, COPY package.json ./npm installCOPY ./ ./ 위에 있기 때문에 Cache를 사용한다.

참고

  • https://jonnung.dev/docker/2020/04/08/optimizing-docker-images/