https://docs.docker.com/get-started/docker-concepts/building-images/using-the-build-cache/


Explanation

이전 내용들을 따라했다면(getting-started 앱), 다음과 같은 Dockerfile을 생성했을 것 :

FROM node:20-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "./src/index.js"]

새 이미지를 만들기 위해 docker build 명령어를 실행하면, Docker는 명시된 순서대로 각 지침(instruction)을 수행하며 레이어를 생성하며 Dockerfile 내의 각 명령어들을 실행함. 각 지침(instruction)에 대해, Docker는 이전 빌드로부터 해당 지침을 재사용할 수 있는 지 확인함. 만약 Docker가 이미 비슷한 지침을 수행했다는 것을 발견하면, Docker는 다시 명령을 수행하지 않고 캐시된 결과를 사용함. 해당 방법을 통해 시간과 자원을 절약하며 빌드 프로세스를 더 빠르고 효율적으로 수행 가능

빌드 캐시는 이전 빌드를 재사용하고 불필요한 작업은 건너뜀으로써 효과적으로 더 빠른 빌드를 가능하게 함. 캐시 사용을 극대화하고 자원 집약적이며 시간 절약이 가능한 재빌드를 수행하려면, 캐시를 무력화하는 작업들에 대해서 파악하는 것 또한 중요함.

다음은 캐싱을 무력화하는 예시 :

Try it out

Node.js application을 이용해 어떻게 Docker build cache를 효과적으로 사용하는지 살펴봄

Build the application

  1. Docker Desktop 설치

  2. 터미널을 열고 https://github.com/dockersamples/todo-list-app를 clone해옴

    git clone <https://github.com/dockersamples/todo-list-app>
    

    스크린샷 2025-01-16 오전 1.04.27.png

  3. todo-list-app 디렉토리로 이동

    cd todo-list-app
    

    해당 디렉토리에서, 다음 내용을 포함한 Dockerfile을 볼 수 있음 :

    cd : change directory
ls : list
cat : 파일 내용 확인

    cd : change directory ls : list cat : 파일 내용 확인

  4. 도커 이미지를 빌드하기 위해 다음 명령어 입력

    docker build .
    

    아무래도 이전 내용들을 따라하다보니, 캐싱이 되어있음을 볼 수 있음(CACHED)

    아무래도 이전 내용들을 따라하다보니, 캐싱이 되어있음을 볼 수 있음(CACHED)

  5. 변화없이 재빌드

    docker build .
    

    윗 사진과 같이 나옴을 확인 가능

    초기화 이후 빌드들은 캐싱 메커니즘에 의해 명령이나 내용이 변하지 않으면 더 빨리 이뤄짐. 도커는 빌드 프로세스 동안 중간 레이어들을 캐싱함. 도커 파일이나 소스코드의 변화없이 이미지를 재빌드하면, 도커는 캐시된 레이어를 재사용함으로써 빠른 속도로 빌드 프로세스를 끝냄

    설치 의존성과 같은 시간 소모성 작업들은 재사용함으로써 빌드 속도를 끌어올림

    docker image history 출력 내용을 확인해보면, 도커 파일 내 각 명령은 이미지 내 새 레이어가 된다는 것을 확인 가능. 우리는 만약 이미지에 변화를 주면, yarn dependency들은 재설치되어야함을 배웠음. 이는 같은 의존성을 매 빌드마다 재설치해야한다는 말. 즉, 이해할 수 없음(낭비니까)

    이를 해결하려면, 도커 파일을 고쳐 무력화가 필요한 경우 이전까진 계속해서 유효할 수 있도록 의존성을 캐싱해야함. Node기반의 앱은, 의존성들은 package.json 파일에 정의됨. 만약 파일에 변화가 있다면 재설치하되, 변화가 없는 경우엔 캐싱된 의존성을 이용해야함. 해당 파일을 우선 복사하는 것을 시작으로, 의존성들을 설치하고, 나머지들을 복사해야함. 그러면, package.json 파일에 변화가 있는 경우에만 yarn 의존성을 재생성하면 됨

  6. package.json 파일을 먼저 복사할 수 있도록 Dockerfile을 바꾸기. 의존성들을 설치하고, 다른 것들을 복사 :

    FROM node:20-alpine
    WORKDIR /app
    COPY package.json yarn.lock ./
    RUN yarn install --production 
    COPY . . 
    EXPOSE 3000
    CMD ["node", "src/index.js"]