
도커에 대해 공부하다 도커 캐시에 대해 알게되었고 도커 레이어에 대해 찾아보게 되었습니다. 도커 이미지를 빌드하면서 더욱 빠르게 빌드를 진행할 수 있는 방법이 있다해서 기록해보려고 합니다.
도커는 image를 빌드하고 container를 실행할 때 layer를 쌓게됩니다.


매번 다 빌드를 새로하면 속도도 느리고 리소스 손실도 발생할 수 있습니다. 그래서 도커는 이전에 빌드시 저장해둔 기록을 캐시로 가지고 있으면서 새로운 이미지를 만들 때 캐시를 활용해 빠른 속도로 빌드가 가능합니다.
도커는 어떤 기준을 가지고 캐시를 활용할까요?
도커에서는 "ADD, COPY"를 제외하면 String의 형태만 확인하고, "ADD, COPY"등 호스트OS의 파일 또는 디렉토리를 컨테이너 안의 경로로 복사하는 명령어는 String + 내용의 변화까지 확인합니다. 즉, 파일이 변경되면 동일한 명령어라도 캐시가 적용되지 않습니다.
예시 1:
# Dockerfile
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y vim
위 코드는 ubuntu:22.04 이미지를 기반으로 vim을 설치하는 간단한 도커파일입니다. 처음 빌드시 apt-get update와 apt-get install 명령어가 실행되고 레이어가 생성됩니다.
이후 동일한 코드로 빌드를 수행하면(apt-get update와 apt-get install -y vim) 이전에 빌드한 레이어를 재활용하여 빌드 시간을 줄일 수 있습니다.
단, 여기서 RUN apt-get update && apt-get install nginx
라고 입력한다면 apt-get update
만 캐시를 활용할 수 있고, apt-get install nginx
는 캐시를 활용할 수 없습니다.
(옵션 -y는 캐시에 영향을 미치지 않습니다)
예시 2:
FROM node:10
WORKDIR /usr/src/app
COPY package.json .
node:10 이미지를 기반으로 작업 디렉토리를 /usr/src/app으로 설정하고 현재 디렉토리의 package.json 파일을 이미지에 복사하는 도커파일입니다.
처음 빌드할 때 package.json의 파일이 컨테이너에 복사되고 레이어가 생성됩니다.
하지만 package.json의 파일 내용을 변경하고 동일한 코드로 빌드를 수행하면 새 레이어가 생성됩니다.
정리하면, COPY와 ADD 명령어는 파일의 내용변경까지 확인한 후 캐시를 사용할지 안할지 결정하고, 그 이외의 명령어는 도커파일에서 명령어만 변경되지 않으면 생성된 레이어를 재활용해 빌드합니다.
추가:
선택적으로 캐시를 활용할 수 있는 명령어도 있습니다.
--cache-from: 이전 빌드의 캐시를 선택적으로 활용가능
--no-cache: 모든 캐시를 무시하고 모든 레이어를 새로 생성
docker build --cache-from <이전 이미지 이름> -t <내 이미지> .
docker build --no-cache -t <내 이미지> .
캐시를 활용할 때 동일한 패키지를 설치하는 경우
RUN apt-get install -y vim
# 이전에 사용했던 명령어와 같은 내용 입력
RUN apt-get install -y vim
# --cache-from 사용
RUN apt-get install --cache-from <이전 이미지 이름> nginx
다음은 캐시 공유가 가능한 명령어와 그렇지 않은 명령어에 대해 알아보겠습니다
[Docker] 도커 빌드 캐시 공유가 가능한 명령어, 공유X 명령어
도커파일의 명령어 중 COPY와 ADD는 캐시를 이용할 때 String과 함께 파일의 내용 변화도 확인한 후 캐시 사용 여부를 결정한다고 저번 포스팅에서 말했습니다. Docker cache 빠른 빌드 [Docker] Docker cache
hgk5722.tistory.com
'[Cloud] > [Docker]' 카테고리의 다른 글
[Docker] 도커 빌드 캐시 공유 가능한 명령어, 공유 불가 명령어 (2) | 2024.03.08 |
---|---|
[Docker] 도커파일 기본설정 ubuntu, alpine, python:3.9-slim (0) | 2024.03.05 |
[Docker] 도커 기본 명령어 (2) | 2023.12.11 |
[Docker] 도커의 이미지, 컨테이너는 무엇일까? (2) | 2023.11.26 |