목표

  • Docker 빌드 시 캐시가 사용되는 방법을 이해한다.

레이어

  • Docker가 빌드될 때 캐시가 동작하는 방법을 이해하기 전에 먼저 Docker 이미지의 레이어가 무엇인지 이해해야 된다.
  • 하나의 이미지는 여러 개의 레이어로 구성된다.
  • 각 레이어는 Dockerfile에 있는 각 명령어의 빌드 결과다.
  • 각 레이어는 이전 레이어과의 차이값을 나타내고 있다.
  • 아래 Dockerfile이 있으면 그림과 같이 각 명령어의 결과가 하나의 레이어가 된다고 볼 수 있다.
# syntax=docker/dockerfile:1
FROM ubuntu:latest

RUN apt-get update && apt-get install -y build-essentials
COPY main.c Makefile /src/
WORKDIR /src/
RUN make build

빌드 캐시의 작동 방식

  • 빌드가 시작되면 빌더가 각 명령어에 캐시된 레이어가 있는지 비교하고, 히트된 캐시 레이어가 있으면 이를 재사용한다.
  • 캐시 레이어가 히트 되는지는 명령어 종류에 따라 다르다.
    • ADD, COPY, --mount=type=bind 옵션이 있는 RUN
      • 사용하는 파일의 메타데이터에서 캐시 체크섬을 계산해서 캐시가 유효한지 확인한다.
      • 파일의 수정 시간은 체크섬에 포함되지 않는다.
    • 그 외의 경우
      • 명령어 문자열이 변하지 않으면 히트된다.
      • 예) RUN apt-get -y update 명령을 처리할 때 컨테이너에 업데이트 파일이 있는지 상관없이, 명령어 문자열은 변하지 않았으므로 캐시 레이어를 재사용한다.
  • 캐시를 사용하지 않고 싶다면, docker builder prune을 상요해서 캐시를 지우거나, --no-cache 또는 --no-cache-filter 옵션으로 캐시를 사용하지 않도록 한다.
  • 이전 레이어에서 캐시가 히트되지 않는다면 가 이후의 레이어에도 캐시가 무효화되어 모두 다시 실행하게 된다.

참고 자료