Notice
Recent Posts
Recent Comments
관리 메뉴

즐겁게, 코드

레이어 캐싱을 활용해 이미지 빌드 최적화하기 본문

☁️ 클라우드/Docker

레이어 캐싱을 활용해 이미지 빌드 최적화하기

Chamming2 2022. 4. 4. 19:25

이미지에 파일을 하나 추가했다고 해서 처음부터 수백 메가에 달하는 파일을 다시 다운받는다면 굉장히 비효율적일 것입니다.

하지만, 도커 데몬은 레이어 를 활용해 이미지를 빌드할 때 파일이 추가되거나 변경될 때마다 해당 동작을 캐시합니다.

 

오늘은 도커파일을 잘 작성해 레이어의 캐싱을 최대화하고, 이를 통해 이미지 빌드 속도를 최적화하는 팁을 소개해보려 합니다.

이미지 생성하기

간단한 node.js 어플리케이션 하나를 이미지로 만들어 보겠습니다.

코드는 다음과 같습니다.

const express = require('express');

const app = express();

app.get('/', (req, res) => {
  res.send(`
    <h1>간단한 node.js 어플리케이션입니다.</h1>
  `);
})

app.listen(3000);

이제 도커파일을 작성합니다.

(만약 비효율적인 부분을 찾으셨다면 예리하게 짚으신 겁니다!)

FROM node

WORKDIR /src

COPY . .

RUN npm install

EXPOSE 3000

CMD node index.js

이 도커파일은 어떤 점에서 비효율적인 걸까요?

한번 어플리케이션을 조금만 변경하고 다시 이미지를 만들어 보겠습니다.

const express = require('express');

const app = express();

app.get('/', (req, res) => {
  res.send(`
    <h3>변경된 node.js 어플리케이션입니다!</h3>
  `);
})

app.listen(3000);

새로운 패키지를 설치하거나 변경하지 않고 어플리케이션의 코드를 한 줄 바꿨을 뿐인데도, 패키지 의존성을 전부 새로 설치하면서 시간이 소요되는 모습입니다. 그럼 어떻게 해야 패키지 설치 과정을 최적화할 수 있을까요?

패키지 설치 단계 캐싱하기

방법은 모든 파일을 한번에 복사하는 대신, 필요한 의존성 목록이 명시된 파일을 먼저 복사하는 것입니다.

FROM node

WORKDIR /src

# package.json 을 먼저 복사하고, 의존성을 설치합니다.
COPY ./package.json .

# 의존성을 설치한 결과물이 레이어에 캐시됩니다.
RUN npm install

# 이제 소스 코드를 변경하면, 이전 단계를 생략하고 여기부터 실행됩니다.
COPY . .

EXPOSE 3000

CMD node index.js

의존성 목록 파일 복사 및 패키지 설치 단계에서 캐시를 활용하는 모습

보이시나요? 첫 빌드에서는 4.6초가 소요되었지만 두 번째 빌드부터는 레이어에 캐시된 의존성을 그대로 사용해 빌드 시간을 1.2초까지 절감한 모습입니다.

정리

  • 패키지 설치 등 시간이 많이 소요되는 작업에 대해 레이어 캐싱을 활용하면, 보다 최적화된 이미지 빌드가 가능하다.
  • package.json 등의 의존성 목록 파일을 복사 - 패키지 설치 단계를 수행하고, 설치가 끝난 다음 소스 코드를 복사한다.
반응형
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆