본문 바로가기
클라우드/Backstage

Backstage 배포의 정석: 빌드 속도는 올리고 이미지 크기는 줄이는 5가지 전략

by gasbugs 2025. 12. 26.

안녕하세요! 오늘은 개발자 포털의 대세, Backstage(백스테이지)를 컨테이너화할 때 가장 고민되는 부분인 '빌드 속도''이미지 크기' 최적화 전략에 대해 깊이 있게 알아보겠습니다. 🚀

Backstage는 강력한 만큼 의존성도 많고 빌드 과정이 복잡할 수 있는데요. 어떻게 하면 운영 환경에서 빠르고 가볍게 배포할 수 있는지 핵심 전략을 정리해 드립니다! 💡


🏗️ Backstage 컨테이너 최적화, 왜 중요할까?

Backstage는 대규모 모노레포(Monorepo) 구조를 가지고 있어, 아무런 최적화 없이 Docker 빌드를 진행하면 다음과 같은 문제에 직면하게 됩니다.

  • 거대한 이미지 크기: 수백 MB에서 GB 단위까지 늘어나는 이미지 뚱뚱이 현상 🐘
  • 느린 빌드 시간: 소스 코드 한 줄 고쳤는데 전체 의존성을 다시 설치하느라 커피 한 잔 마시고 와야 하는 상황 ☕
  • 보안 취약점: 불필요한 빌드 도구가 이미지에 포함되어 공격 표면이 넓어짐 🛡️

이를 해결하기 위한 최고의 전략들을 하나씩 살펴봅시다!


1. 멀티 스테이지 빌드 (Multi-stage Builds) 적용 🖇️

가장 기본적이면서도 강력한 전략입니다. 빌드 단계와 실행 단계를 분리하여, 최종 이미지에는 실행에 꼭 필요한 파일만 남기는 방식입니다.

✅ 어떻게 구성하나요?

  1. Build Stage: Node.js 전체 환경, Python(일부 네이티브 모듈 빌드용), Yarn 등 모든 빌드 도구를 포함하여 yarn build를 수행합니다.
  2. Production Stage: 빌드가 완료된 정적 파일과 컴파일된 백엔드 바이너리만 복사해 옵니다. 보통 node:slim이나 alpine 버전을 사용하여 베이스 이미지 크기를 최소화합니다.

이렇게 하면 빌드용 라이브러리(예: gcc, make, python)가 최종 이미지에서 제거되어 크기가 80% 이상 줄어들 수 있습니다! 📉


2. 레이어 캐싱 전략 (Layer Caching) ⚡

Docker는 변경되지 않은 레이어를 재사용합니다. 하지만 순서를 잘못 배치하면 매번 모든 의존성을 새로 설치하게 됩니다.

✅ 최적화 꿀팁

  • 의존성 파일을 먼저 복사: COPY . .을 먼저 하기보다 package.json과 yarn.lock만 먼저 복사하고 yarn install을 실행하세요. 소스 코드가 바뀌어도 라이브러리 레이어는 캐시를 유지할 수 있습니다.
  • Skeleton 활용: Backstage는 yarn build 시 skeleton.tar.gz와 bundle.tar.gz를 생성할 수 있습니다. skeleton에는 의존성 구조만 들어있어 캐시 효율을 극대화합니다. 🦴

3. 베이스 이미지 선택: Slim vs Alpine 🐧

이미지 크기를 줄이기 위해 어떤 OS를 기반으로 할지가 중요합니다.

이미지 타입 크기 특징
Node Default 약 900MB+ 모든 도구가 포함되어 무거움
Node Slim 약 200MB 데비안 기반, 호환성이 좋고 가벼움
Node Alpine 약 50MB 초경량, musl libc 사용으로 일부 네이티브 모듈과 충돌 가능성 있음

추천 전략: 호환성과 안정성을 고려한다면 node:20-slim (또는 최신 LTS slim 버전)이 Backstage 운영 환경에 가장 적합한 밸런스를 보여줍니다. ⚖️


4. Docker BuildKit과 캐시 마운트 🛠️

현대적인 Docker 환경에서는 BuildKit을 활성화하고 --mount=type=cache 옵션을 사용하는 것이 필수입니다.

Dockerfile
# 예시: Yarn 캐시를 활용한 빌드
RUN --mount=type=cache,target=/root/.yarn/berry/cache \
    yarn install --immutable

이 방식을 사용하면 CI/CD 파이프라인에서 빌드할 때마다 수백 개의 패키지를 새로 다운로드하지 않고, 호스트의 캐시 디렉토리를 재사용하여 빌드 속도를 획기적으로 높일 수 있습니다. 🏎️💨


5. 불필요한 파일 제거 (.dockerignore) 🚫

이미지 빌드 컨텍스트에 포함되지 않아도 되는 파일들을 철저히 제외해야 합니다. .dockerignore 파일에 다음 항목들을 꼭 추가하세요!

  • node_modules (빌드 스테이지에서 새로 설치하므로)
  • .git (버전 관리 기록은 운영에 불필요)
  • dist 및 빌드 아티팩트
  • *.md, docs 등 문서 파일

📝 요약 및 결론

Backstage 컨테이너화를 최적화하는 '골든 레시피'는 다음과 같습니다.

  1. 멀티 스테이지 빌드로 빌드 도구와 결과물 분리 ✂️
  2. node:slim 계열의 가벼운 베이스 이미지 사용 🍃
  3. Skeleton 구조레이어 순서 배치로 캐시 효율 극대화 🔄
  4. BuildKit 캐시 마운트로 패키지 설치 시간 단축 ⚡
  5. .dockerignore로 군더더기 없는 빌드 컨텍스트 유지 🧹

이 전략들을 적용하면 더 빠르고, 더 안전하며, 더 가벼운 Backstage 서비스를 운영하실 수 있습니다! 여러분의 배포 파이프라인이 한결 가벼워지길 바랍니다. 😊