--cache-from 및 --cache-to 를 사용하여 빌드 캐시 관리
이 단계에서는 --cache-from 및 --cache-to 플래그를 사용하여 Docker 빌드 캐시를 관리하는 방법을 배웁니다. 빌드 캐시는 이전 빌드의 레이어를 재사용하여 후속 빌드의 속도를 크게 높일 수 있습니다. --cache-from을 사용하면 캐시 소스로 사용할 이미지를 지정할 수 있으며, --cache-to를 사용하면 빌드 캐시를 지정된 위치 (예: 레지스트리 또는 로컬 디렉토리) 로 내보낼 수 있습니다.
먼저, ~/project 디렉토리에 있는지 확인합니다.
cd ~/project
캐시를 손상시킬 수 있는 변경 사항을 시뮬레이션하기 위해 Dockerfile을 약간 수정해 보겠습니다. 간단한 RUN 지침을 추가합니다.
nano로 Dockerfile을 엽니다.
nano Dockerfile
builder 단계에서 ARG 지침 뒤에 다음 줄을 추가합니다.
RUN echo "Adding a new layer"
업데이트된 Dockerfile은 다음과 같아야 합니다.
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding a new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
Dockerfile을 저장하고 nano를 종료합니다.
이제 특정 캐시 옵션을 사용하지 않고 이미지를 다시 빌드해 보겠습니다. Docker 는 사용 가능한 경우 로컬 캐시를 자동으로 사용합니다.
docker build -t my-cached-image .
새 지침을 추가했으므로 일부 레이어가 처음부터 빌드되어 후속 지침에 대한 캐시가 무효화되는 것을 볼 수 있습니다.
이제 이전에 빌드된 이미지를 캐시 소스로 사용하려는 시나리오를 시뮬레이션해 보겠습니다. 예를 들어 레지스트리 또는 다른 빌드에서 가져올 수 있습니다. 데모 목적으로 방금 빌드한 my-cached-image를 새 빌드의 캐시 소스로 사용합니다.
먼저, Dockerfile을 다시 약간 변경하여 또 다른 수정을 시뮬레이션해 보겠습니다.
Dockerfile을 엽니다.
nano Dockerfile
새 RUN 지침의 메시지를 변경합니다.
RUN echo "Adding another new layer"
업데이트된 Dockerfile은 다음과 같아야 합니다.
## Stage 1: Builder stage
FROM ubuntu:latest as builder
ARG GREETING="Hello from build argument!"
RUN echo "Adding another new layer"
RUN echo $GREETING > /app/greeting.txt
## Stage 2: Final stage
FROM ubuntu:latest
COPY --from=builder /app/greeting.txt /greeting.txt
CMD ["cat", "/greeting.txt"]
저장하고 nano를 종료합니다.
이제 이미지를 다시 빌드하지만 이번에는 --cache-from 플래그를 사용하여 my-cached-image를 캐시 소스로 지정합니다.
docker build --cache-from my-cached-image -t my-cached-image-from .
Docker 가 my-cached-image에서 레이어를 사용하려고 시도하는 것을 관찰해야 합니다. 첫 번째 RUN 지침에 해당하는 레이어는 지침이 변경되었으므로 다시 빌드될 가능성이 높지만, 일치하는 경우 후속 레이어는 캐시에서 가져올 수 있습니다.
--cache-to 플래그는 빌드 캐시를 내보내는 데 사용됩니다. 이는 CI/CD 파이프라인에서 빌드 간에 캐시를 공유하는 데 특히 유용합니다. --cache-to를 사용하려면 일반적으로 docker-container 드라이버와 같이 캐시 내보내기를 지원하는 빌드 드라이버를 사용해야 합니다.
먼저, buildx 와 함께 자주 사용되는 Docker Compose 를 설치해 보겠습니다.
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
이제 buildx 빌더 인스턴스를 만들어 보겠습니다.
docker buildx create --use
이제 이미지를 빌드하고 캐시를 로컬 디렉토리로 내보내겠습니다. local 캐시 익스포터를 사용합니다.
docker buildx build --cache-to type=local,dest=./build-cache -t my-exported-cache-image . --load
docker buildx build: 빌드에 buildx 도구를 사용합니다.
--cache-to type=local,dest=./build-cache: 캐시를 현재 디렉토리의 build-cache라는 로컬 디렉토리로 내보냅니다.
-t my-exported-cache-image: 결과 이미지에 태그를 지정합니다.
. : 빌드 컨텍스트 (현재 디렉토리) 를 지정합니다.
--load: 빌드된 이미지를 로컬 Docker 이미지 캐시에 로드합니다.
빌드 및 캐시 내보내기를 나타내는 출력을 볼 수 있습니다. ~/project 디렉토리에 build-cache 디렉토리가 생성됩니다.
이제 깨끗한 빌드 환경을 시뮬레이션하고 내보낸 캐시를 사용하여 빌드해 보겠습니다. 먼저, 빌드한 이미지를 제거해 보겠습니다.
docker rmi my-cached-image my-cached-image-from my-exported-cache-image
이제 이미지를 다시 빌드하지만 이번에는 내보낸 캐시를 소스로 사용합니다.
docker buildx build --cache-from type=local,src=./build-cache -t my-imported-cache-image . --load
--cache-from type=local,src=./build-cache: 로컬 디렉토리 build-cache에서 캐시를 가져옵니다.
Docker 가 내보낸 캐시의 레이어를 사용하여 처음부터 빌드하는 것보다 빌드 프로세스의 속도를 크게 높이는 것을 관찰해야 합니다.