Cache?

hzbbo·2023년 1월 10일
0

Theory

목록 보기
2/2

Cache Memory?

Cache란 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 아래와 같은 저장공간 계층 구조에서 확인할 수 있듯이, 캐시는 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한다.

Cache Memory는 메인 메모리와 CPU간의 데이터 속도 향상을 위한 중간 버퍼 역할을 하는 CPU내 또는 외에 존재하는 메모리이다. 전체 시스템의 성능의 개선을 시킬 수 있는 메모리이다.

캐시 메모리라고 하면 실제 메모리와 CPU 사이에서 빠르게 전달을 위해서 미리 데이터들을 저장해두는 좀더 빠른 메모리이다. 네트워크에서 캐시는 로컬에 파일을 미리 받아놓고, 그 내용을 보거나 웹서버에서도 매번 로딩을 해야 하는 파일들을 미리 로딩해두고, 응답을 주기도 한다. 데이터 베이스를 매번 확인해야 하는것도 캐시서버를 이용한다면 빠른 응답을 해줄 수 있다.

Docker Cache?

같은 Dockerfile을 다시 빌드하게 되면 아래와 같이 캐시를 사용하는 것으로 빌드 메시지가 나오게 된다.

만약 Dockerfile에서 소스파일을 git으로 가져오는데 소스파일을 수정하고, 다시 빌드할 경우에 캐시가 사용되어 바뀐 소스파일이 적용되지 않는 경우가 생긴다.

위 상황에서 캐시를 사용하지 않으려면, --no-cache 옵션을 주면 된다.
docker build --no-cache -t image:version .

--no-cache 옵션은 모든 레이어의 캐시를 사용하지 않는 옵션이기 때문에 특정 레이어부터 캐시 비활성화를 설정할 수 없다.

이럴 경우, 명령어 혹은 옵션으로 해결 방법이 존재하는 것은 아니지만 우회하여 해결할 수 있다.
ARG를 통해 argument를 전달한다.

Dockerfile
--------------------------------
FROM gradle:7.1.0-jdk11

USER root

COPY ./test1.txt/

ARG DISABLE_CACHE

RUN useradd -ms /bin/bash wasadm

COPY ./test2.txt/

docker build --build-arg DISABLE_CACHE=$CUR_TIME -t image:version .

위와 같이 DISABLE_CACHE argument 값을 준 후 빌드를 하면 ARG로 이전의 레이어는 캐시를 사용하고, 이후는 캐시를 사용하지 않고 RUN으로 실행 명령어가 실행되게 된다.

캐시 비활성화를 위해 넘겨주는 ARG 는 위의 시간 값처럼 항상 변하는 값이어야 한다.

  • 고정된 값을 줄 경우 처음에만 캐시를 사용하지 않고, 두 번째 이후부터는 다시 캐시를 사용한다.

이 방법은 RUN 명령어 이후만 캐시 비활성화가 가능하다.

  • COPY 에는 적용되지 않기 때문에 ARG 선언부가 RUN 밑으로 오게 되면 ‘COPY ./test2.txt’ 부분은 계속 캐시를 사용하게 된다.
  • 만약 COPY에도 적용하고 싶다면 ARG - RUN - COPY 순으로 Dockerfile을 작성하면 RUN 이후의 COPY까지도 캐시를 사용하지 않게 된다.

참조
https://wikidocs.net/65523
https://postlude.github.io/2020/12/31/docker-build-disable-cache/
https://mangkyu.tistory.com/69

0개의 댓글