☁️Infra

Node.js Docker 이미지 2.5GB → 300MB 줄이기: standalone server.js 활용

Node.js Docker 이미지 크기 문제, 2.5GB에서 300MB로 줄이는 비결! standalone server.js와 pkg 활용법을 소개합니다.

📅 2026년 6월 8일·📖 5분 읽기·👁 4

Node.js Docker 이미지 2.5GB → 300MB 줄이기: standalone server.js 활용

Node.js 애플리케이션을 Docker로 빌드할 때 이미지 크기가 예상보다 훨씬 커져 배포 속도가 느려지는 문제에 직면하셨나요? 특히 복잡한 빌드 환경에서 이런 문제가 자주 발생하곤 합니다. 이 글에서는 이미지 크기를 획기적으로 줄여 배포 시간을 단축하는 방법을 공유합니다.

시도와 함정

초기에는 빌드 환경 자체를 최적화하는 데 집중했습니다. Cloud Build와 같은 CI/CD 환경에서 빌드 머신의 코어 수를 늘리면 빌드 속도가 빨라질 거라 생각했죠.

# Cloud Build 설정 예시 (실제 설정은 다를 수 있음)
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/my-project/my-app:${SHORT_SHA}', '.']
timeout: '1200s' # 20분 타임아웃
machineType: 'n1-standard-8' # 8코어 설정

하지만 아무리 빌드 환경을 늘려도 이미지 크기 자체는 줄어들지 않았습니다. 빌드 속도는 약간 개선되었지만, 근본적인 문제 해결에는 미치지 못했습니다. 오히려 불필요한 의존성이나 개발 도구들이 이미지에 포함되면서 크기가 계속 불어나는 것을 확인했습니다.

원인

핵심적인 문제는 Dockerfile 내에서 애플리케이션 빌드와 실행에 필요한 모든 것을 한 번에 처리하려 했기 때문입니다. 특히, npm install 과정에서 개발 의존성까지 모두 설치하고, 복잡한 빌드 스크립트들이 이미지에 잔존하면서 용량이 커졌습니다. 또한, Node.js 런타임 자체와 함께 필요한 라이브러리들이 포함되면서 최종 이미지 크기가 2.5GB까지 육박했습니다.

해결

해결책은 애플리케이션을 실행하는 데 필요한 최소한의 요소만 포함하는 standalone server.js 파일을 만드는 것이었습니다. 이를 위해 pkg와 같은 도구를 활용하여 Node.js 애플리케이션을 단일 실행 파일로 패키징했습니다.

먼저, package.json에 필요한 의존성만 명시하고, npm install --production으로 실제 운영에 필요한 패키지만 설치합니다.

{
  "name": "my-app",
  "version": "1.0.0",
  "main": "server.js",
  "dependencies": {
    "express": "^4.18.2",
    "body-parser": "^1.20.2"
    // ... 운영에 필요한 의존성만 명시
  },
  "devDependencies": {
    // ... 개발/빌드 시에만 필요한 의존성은 제외
  }
}

그 후, pkg를 사용하여 server.js를 포함한 애플리케이션을 단일 바이너리로 만듭니다.

npm install -g pkg
pkg server.js --targets node18-linux-x64 --out-path dist

이렇게 생성된 단일 실행 파일(dist/my-app-linux-x64)을 기반으로 Docker 이미지를 빌드합니다. Alpine Linux와 같은 경량 OS를 사용하고, 이 단일 실행 파일만 복사하여 이미지 크기를 최소화합니다.

FROM alpine:3.18

WORKDIR /app

COPY dist/my-app-linux-x64 /app/my-app

EXPOSE 3000

CMD ["/app/my-app"]

이 방식을 사용하면 불필요한 파일과 개발 도구가 제외되어 이미지 크기가 2.5GB에서 약 300MB 수준으로 대폭 줄어드는 것을 확인할 수 있습니다.

결과

  • Docker 이미지 크기가 2.5GB에서 약 300MB로 8배 이상 감소했습니다.
  • 배포 시간이 기존 약 20분에서 약 7분으로 획기적으로 단축되었습니다.
  • 이미지 다운로드 및 컨테이너 시작 시간이 빨라져 전반적인 배포 파이프라인 효율성이 증대되었습니다.

정리 — 같은 함정 안 빠지려면

  • [ ] Dockerfile에서 npm install--production 플래그를 사용하여 운영 의존성만 설치했는지 확인하세요.
  • [ ] 애플리케이션을 단일 실행 파일로 패키징하는 도구(pkg 등) 사용을 고려해보세요.
  • [ ] 경량 OS(Alpine Linux 등)를 기반으로 Docker 이미지를 빌드하세요.
  • [ ] 빌드 시 생성되는 불필요한 파일이나 개발 도구들이 최종 이미지에 포함되지 않도록 Dockerfile을 최적화하세요.

태그

#Node.js#Docker#이미지 최적화#pkg#standalone server.js#배포 속도 개선