https://docs.docker.com/get-started/docker-concepts/building-images/using-the-build-cache/
이전 내용들을 따라했다면(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는 다시 명령을 수행하지 않고 캐시된 결과를 사용함. 해당 방법을 통해 시간과 자원을 절약하며 빌드 프로세스를 더 빠르고 효율적으로 수행 가능
빌드 캐시는 이전 빌드를 재사용하고 불필요한 작업은 건너뜀으로써 효과적으로 더 빠른 빌드를 가능하게 함. 캐시 사용을 극대화하고 자원 집약적이며 시간 절약이 가능한 재빌드를 수행하려면, 캐시를 무력화하는 작업들에 대해서 파악하는 것 또한 중요함.
다음은 캐싱을 무력화하는 예시 :
RUN
지침에 대한 어떠한 변화는 해당 레이어를 무력화시킴. Docker는 RUN
명령에 대해 변화가 있는지 감지하고 확인하면서, 만약 어떠한 변화가 있으면 캐시를 무력화함COPY
또는 ADD
지침에서 이미지에 복사하는 파일들에 대한 어떠한 변화가 있으면 무력화됨. Docker는 계속 프로젝트 디렉토리 내의 파일들의 변화를 감시함. 만약 내용이나 속성의 변화가 있으면, 빌드 캐싱 무력화의 트리거로서 작동됨Node.js application을 이용해 어떻게 Docker build cache를 효과적으로 사용하는지 살펴봄
Docker Desktop 설치
터미널을 열고 https://github.com/dockersamples/todo-list-app를 clone해옴
git clone <https://github.com/dockersamples/todo-list-app>
todo-list-app 디렉토리로 이동
cd todo-list-app
해당 디렉토리에서, 다음 내용을 포함한 Dockerfile을 볼 수 있음 :
cd : change directory ls : list cat : 파일 내용 확인
도커 이미지를 빌드하기 위해 다음 명령어 입력
docker build .
아무래도 이전 내용들을 따라하다보니, 캐싱이 되어있음을 볼 수 있음(CACHED)
변화없이 재빌드
docker build .
윗 사진과 같이 나옴을 확인 가능
초기화 이후 빌드들은 캐싱 메커니즘에 의해 명령이나 내용이 변하지 않으면 더 빨리 이뤄짐. 도커는 빌드 프로세스 동안 중간 레이어들을 캐싱함. 도커 파일이나 소스코드의 변화없이 이미지를 재빌드하면, 도커는 캐시된 레이어를 재사용함으로써 빠른 속도로 빌드 프로세스를 끝냄
설치 의존성과 같은 시간 소모성 작업들은 재사용함으로써 빌드 속도를 끌어올림
docker image history
출력 내용을 확인해보면, 도커 파일 내 각 명령은 이미지 내 새 레이어가 된다는 것을 확인 가능. 우리는 만약 이미지에 변화를 주면, yarn
dependency들은 재설치되어야함을 배웠음. 이는 같은 의존성을 매 빌드마다 재설치해야한다는 말. 즉, 이해할 수 없음(낭비니까)
이를 해결하려면, 도커 파일을 고쳐 무력화가 필요한 경우 이전까진 계속해서 유효할 수 있도록 의존성을 캐싱해야함. Node기반의 앱은, 의존성들은 package.json
파일에 정의됨. 만약 파일에 변화가 있다면 재설치하되, 변화가 없는 경우엔 캐싱된 의존성을 이용해야함. 해당 파일을 우선 복사하는 것을 시작으로, 의존성들을 설치하고, 나머지들을 복사해야함. 그러면, package.json
파일에 변화가 있는 경우에만 yarn 의존성을 재생성하면 됨
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"]