Docker caching 전략

Hyuk4316·2024년 2월 14일
0

Docker

목록 보기
2/3
post-thumbnail

만약 Docker Build를 여러번 수행해야 한다면 캐싱 전략을 알아두는 것도 좋은 방법이 될 수 있다.
Cache 관리 방법을 안다면 반복적으로 수행되는 작업의 시간을 줄일 수 있게 된다.

캐시 동작 방식

# syntax=docker/dockerfile:1
FROM ubuntu:latest

RUN apt-get update && apt-get install -y build-essentials
COPY main.c Makefile /src/
WORKDIR /src/
RUN make build

Dockerfile이 빌드되면 첫번째 이미지와 같은 Layer를 가지게 되는데, 만약 main.c에서 변화가 생겼다면 기존의 캐시를 무효화한다. 그 대상은 변화가 생긴 Layer와 그 이후 시행될 Layer가 된다.

효율적으로 cache를 사용하는 방법

1. Layer 순서를 변경하라

# syntax=docker/dockerfile:1
FROM node
WORKDIR /app
COPY . .          # Copy over all files in the current directory
RUN npm install   # Install dependencies
RUN npm build     # Run build
# syntax=docker/dockerfile:1
FROM node
WORKDIR /app
COPY package.json yarn.lock .    # Copy package management files
RUN npm install                  # Install dependencies
COPY . .                         # Copy over project files
RUN npm build                    # Run build

위 코드와 아래 코드의 차이가 보이는가? 위 코드라면 소스코드가 조금 바뀐다면 npm install를 다시 실행해 오래걸리는 반해 아래 코드는 install 과정이 생략되어 빠르게 빌드가 가능해진다.

2. Layer를 작게 유지하라

불필요한 파일을 제외하고, 필요한 패키지만 설치하고, run cache를 이용해야 한다.

불필요한 파일이 있고 변경점이 생긴다면 다시 layer를 만드는 과정이 추가된다.
필요한 파일만 선택해 COPY 명령어를 사용하거나, 필요 없는 파일을 .dockerignore파일에 기록해 복사되는 것을 방지할 수 있다.

패키지 메니저를 활용해 필요한 패키지만 다운로드 하는것도 좋은 방법이다.

run cache를 이용한다면 필요한 패키지를 여러번 다운 받을 없이 변경이 생길때만 파일을 가져온다.
RUN --mount type=cache를 이용해 사용할 수 있다.

RUN \
    --mount=type=cache,target=/var/cache/apt \
    apt-get update && apt-get install -y git

3. Layer 수를 줄여라

보다 적절한 base image를 이용하고, 커맨드를 합치고, multi-stage build를 이용해야 한다.

적절한 base image를 사용하면 추가되는 Layer의 수를 줄일 수 있다.

또한 비슷한 동작이 여러번 있을 때 하나로 묶어 layer를 줄일 수 있다.

RUN echo "the first command"
RUN echo "the second command"
RUN echo "the first command" && echo "the second command"
# or to split to multiple lines
RUN echo "the first command" && \
    echo "the second command"

그리고 multi-stage build를 사용하면 여러개의 FROM 명령어를 사용해 명령어를 줄일 수 있다. (이건 맞는 내용인지 모르겠어요)

캐시 지우기

빌드를 하더라도 최신 상태로 유지가 되지 않는 것들이 있을 수 있는데, 이러한 것들을 최신상태로 만들기 위해서는 캐시를 지우는 과정이 필요할 수 있다.

$ docker builder prune

위 명령어를 실행하면 Build Cache를 지운다. (Docker Docs: builder prune)

출처

Docker Docs: cache management

profile
한국공학대학교 소프트웨어전공 23학번

0개의 댓글