perf(CI): frontend Dockerfile standalone output 활용 (21m -> ~9m) #11

Merged
johngreen merged 1 commits from johngreen into main 2026-05-13 07:45:22 +00:00
Contributor

요약

Frontend build 시간 21분 34초 → 약 9분 (57% 단축) 목표. Next.js standalone output 활용.

분석

build log 분석 결과:

  • runner stage 의 COPY node_modules 한 줄이 12분 16초 (전체의 57%)
  • next.config.mjs 의 output: "standalone" 가 이미 prod 빌드에서 활성 상태였으나, Dockerfile 이 standalone 결과물 미활용

변경

docker/deploy/frontend.Dockerfile runner stage:

  • .next 전체 COPY → .next/standalone (server.js + minimal node_modules)
  • .next/static 별도 COPY (standalone 자동 포함 X)
  • public 별도 COPY (standalone 자동 포함 X)
  • node_modules 통째 COPY 제거
  • package.json COPY 제거
  • CMD: npm startnode server.js

안전성 검증

  • frontend 코드의 dynamic require/import 사용: 0건 (정적 import 만)
  • @prisma/client/prisma 실제 import: 0건 (package.json 에만 존재, runtime 미사용)
  • → standalone 의 의존성 추적이 정확하게 작동할 조건

예상 효과

지표 현재 After
빌드 시간 21m 34s ~9m (57% 단축)
이미지 크기 ~1GB ~300MB (70% 단축)
pull 시간 길음 단축
runtime mem 일반 약간 감소

위험 / mitigation

  • Standalone 의 server.js 가 실제로 listen 하는지: ENV PORT 3000 + HOSTNAME 0.0.0.0 명시 유지
  • public 폴더 누락 가능성: 명시적 COPY 추가
  • 만약 page load 시 "Cannot find module ..." 에러 발생: 즉시 명확한 에러 → 해당 deps 를 outputFileTracingIncludes 에 추가하면 됨

🤖 Generated with Claude Code

## 요약 Frontend build 시간 21분 34초 → 약 9분 (57% 단축) 목표. Next.js standalone output 활용. ## 분석 build log 분석 결과: - runner stage 의 `COPY node_modules` 한 줄이 12분 16초 (전체의 57%) - next.config.mjs 의 `output: "standalone"` 가 이미 prod 빌드에서 활성 상태였으나, Dockerfile 이 standalone 결과물 미활용 ## 변경 `docker/deploy/frontend.Dockerfile` runner stage: - `.next` 전체 COPY → `.next/standalone` (server.js + minimal node_modules) - `.next/static` 별도 COPY (standalone 자동 포함 X) - `public` 별도 COPY (standalone 자동 포함 X) - node_modules 통째 COPY **제거** - package.json COPY **제거** - CMD: `npm start` → `node server.js` ## 안전성 검증 - frontend 코드의 dynamic `require`/`import` 사용: **0건** (정적 import 만) - `@prisma/client`/`prisma` 실제 import: **0건** (package.json 에만 존재, runtime 미사용) - → standalone 의 의존성 추적이 정확하게 작동할 조건 ## 예상 효과 | 지표 | 현재 | After | |---|---|---| | 빌드 시간 | 21m 34s | ~9m (57% 단축) | | 이미지 크기 | ~1GB | ~300MB (70% 단축) | | pull 시간 | 길음 | 단축 | | runtime mem | 일반 | 약간 감소 | ## 위험 / mitigation - Standalone 의 server.js 가 실제로 listen 하는지: ENV PORT 3000 + HOSTNAME 0.0.0.0 명시 유지 - public 폴더 누락 가능성: 명시적 COPY 추가 - 만약 page load 시 "Cannot find module ..." 에러 발생: 즉시 명확한 에러 → 해당 deps 를 outputFileTracingIncludes 에 추가하면 됨 🤖 Generated with Claude Code
johngreen added 1 commit 2026-05-13 07:45:21 +00:00
배경:
- frontend build 의 가장 큰 시간 소비 = runner stage 의 COPY node_modules (12분 16초)
- 전체 21분 34초 중 57%
- next.config.mjs 의 output: "standalone" 가 prod 빌드에서 이미 활성 상태였으나, Dockerfile 의 runner stage 가 .next 통째 + node_modules 통째를 COPY 하느라 standalone 결과물 미활용

조치:
- runner stage 재작성:
  - .next 전체 → .next/standalone (server.js + 실제 사용 node_modules)
  - .next/static 별도 COPY (standalone 가 자동 포함 안 함)
  - public 별도 COPY (standalone 가 자동 포함 안 함)
  - node_modules 통째 COPY 제거 (standalone 가 알아서 포함)
  - package.json COPY 제거 (server.js 직접 실행)
  - CMD: npm start → node server.js

검증:
- frontend 에 dynamic require/import 0건 (정적 import 만) → standalone 의존성 추적 정확
- prisma 가 package.json 에 있으나 코드 import 0건 → 자연 제외, 추가 설정 불필요

예상 효과:
- 빌드 시간 21m 34s → 약 9분 (12분 단축, 57% 감소)
- 이미지 크기 약 1GB → 약 300MB (70% 감소)
- pull 시간 단축
- runtime memory footprint 감소

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
johngreen merged commit aeddd7dc2a into main 2026-05-13 07:45:22 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gbpark/invyone#11