[Docker] Docker Image Cache
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 ./ 결과 차이가 없었다. 왜 재빌드 문제를 해결해주는 것일까?
실험
나의 가설은 이렇다.
- 소스에 변화가 없다면 build를 2번하지 않는다.
- 강의에서 말하는 재빌드는
npm의 재빌드가 아니라,Docker이미지 재빌드다.
기존 Dockerfile 실험
기존 Dockerfile로 아래와 같이 Test 했다. 두 작업의 Cache 여부를 비교해본다.
- 소스 변경 없이 재빌드
- 소스 수정 후 다시 빌드
첫 번째, 소스 변경 없이 재빌드다. Cache 한 이미지를 그대로 가져온다.

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

변경 Dockerfile 실험
변경 Dockerfile로 아래와 같이 Test 했다. 두 작업의 Cache 여부를 비교해본다.
- 소스 변경 없이 재빌드
- 소스 수정 후 다시 빌드
첫 번째, 소스 변경 없이 재빌드다. Cache 이미지를 그대로 가져온다.

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

정리
차이점은 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 install가 COPY ./ ./ 위에 있기 때문에 Cache를 사용한다.
참고
- https://jonnung.dev/docker/2020/04/08/optimizing-docker-images/