Next.js 16 + Turbopack + pnpm ๋ชจ๋…ธ๋ ˆํฌ: Docker ๋นŒ๋“œ ์™„์ „ ์ •๋ณต

2026. 1. 17. 01:21ยท๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE)
728x90

๋“ค์–ด๊ฐ€๋ฉฐ

Next.js 16์ด ์ถœ์‹œ๋˜๋ฉด์„œ Turbopack์ด ๊ธฐ๋ณธ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ pnpm ๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ์—์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋ ค๋‹ค ๋ณด๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ณต๋ณ‘๋“ค์„ ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด ๊ธ€์€ ์ œ๊ฐ€ ์‹ค์ œ๋กœ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ ๊ณผ์ •์„ ์ƒ์„ธํžˆ ๊ธฐ๋กํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ํŠœํ† ๋ฆฌ์–ผ์ด ์•„๋‹Œ, ์™œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€์— ์ดˆ์ ์„ ๋งž์ถฐ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.


๐ŸŽฏ ๋ชฉํ‘œ

pnpm workspace ๋ชจ๋…ธ๋ ˆํฌ ๊ตฌ์กฐ์—์„œ Next.js 16 ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ Docker๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” Dockerfile ์ž‘์„ฑ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ:

web10-beastcamp/
โ”œโ”€โ”€ pnpm-workspace.yaml
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ frontend/
โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ””โ”€โ”€ next.config.ts
โ”œโ”€โ”€ backend/
โ”‚   โ”œโ”€โ”€ api-server/
โ”‚   โ””โ”€โ”€ ticket-server/
โ””โ”€โ”€ packages/
    โ””โ”€โ”€ shared-types/

1๋‹จ๊ณ„: ์ฒซ ์‹œ๋„ - Nginx ๊ธฐ๋ฐ˜ ์ ‘๊ทผ

์ฒ˜์Œ์—๋Š” Next.js๋ฅผ ์ •์  ์‚ฌ์ดํŠธ๋กœ ๋นŒ๋“œํ•ด์„œ Nginx๋กœ ์„œ๋น™ํ•˜๋Š” ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

# โŒ ์ดˆ๊ธฐ ๋ฒ„์ „ (์ž‘๋™ํ•˜์ง€ ์•Š์Œ)
FROM node:22-alpine AS builder
WORKDIR /app
COPY . .
RUN npm install -g pnpm
RUN pnpm install
RUN pnpm build

FROM nginx:alpine
COPY --from=builder /app/frontend/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

๐Ÿšจ ์ฒซ ๋ฒˆ์งธ ๋ฒฝ: ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค

$ docker build -f frontend/Dockerfile -t frontend .
[+] Building 2.3s (8/10)
 => ERROR [deps 4/7] COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
------
 > [deps 4/7] COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
------
failed to compute cache key: "/pnpm-workspace.yaml" not found

 

์›์ธ: Dockerfile์ด frontend/ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์ง€๋งŒ, ๋นŒ๋“œ์— ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์ด ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ(๋ฃจํŠธ)์— ์žˆ์–ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ: Docker build context๋ฅผ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋กœ ์„ค์ •ํ•˜๊ณ , Dockerfile ๊ฒฝ๋กœ๋ฅผ -f ํ”Œ๋ž˜๊ทธ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

# โœ… ์˜ฌ๋ฐ”๋ฅธ ๋นŒ๋“œ ๋ช…๋ น
docker build -f frontend/Dockerfile -t frontend .
#                                            ^ ๋ฃจํŠธ์—์„œ ์‹คํ–‰

2๋‹จ๊ณ„: pnpm workspace ์˜์กด์„ฑ ์„ค์น˜

๋ชจ๋…ธ๋ ˆํฌ์—์„œ๋Š” workspace ๊ฐ„ ์˜์กด์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœํžˆ pnpm install๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

# Stage 1: Dependencies
FROM node:22-alpine AS deps
RUN corepack enable && corepack prepare pnpm@latest --activate
WORKDIR /app

# ๋ฃจํŠธ workspace ํŒŒ์ผ๋“ค์„ ๋จผ์ € ๋ณต์‚ฌ
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
COPY packages ./packages
COPY frontend/package.json ./frontend/

# --filter ํ”Œ๋ž˜๊ทธ๋กœ frontend์™€ ๊ทธ ์˜์กด์„ฑ๋งŒ ์„ค์น˜
RUN pnpm install --frozen-lockfile --filter frontend...

๐Ÿ’ก ํ•ต์‹ฌ ํฌ์ธํŠธ

  • --filter frontend... : frontend ํŒจํ‚ค์ง€์™€ ๊ทธ๊ฒƒ์ด ์˜์กดํ•˜๋Š” ๋ชจ๋“  workspace ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค
  • --frozen-lockfile : lock ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์ผ๊ด€๋œ ๋นŒ๋“œ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค
  • packages ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋จผ์ € ๋ณต์‚ฌํ•ด์•ผ workspace ์˜์กด์„ฑ ํ•ด์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

3๋‹จ๊ณ„: Next.js 16 + Turbopack์˜ ์ถฉ๊ฒฉ

๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋Š”๊ฐ€ ์‹ถ๋”๋‹ˆ, ์ƒˆ๋กœ์šด ์—๋Ÿฌ๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

$ pnpm build
Error: Next.js inferred your workspace root at /app, but it may not be correct.
We couldn't find the Next.js package (next/package.json).

Please configure `turbopack.root` in your next.config.js to point to your project root.

๐Ÿ” ๋ฌธ์ œ ๋ถ„์„

Next.js 16๋ถ€ํ„ฐ Turbopack์ด ๊ธฐ๋ณธ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋˜๋ฉด์„œ, workspace root๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ pnpm์˜ ํŠน์ˆ˜ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ(์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๊ธฐ๋ฐ˜)์™€ ์ถฉ๋Œํ•˜๋ฉด์„œ next/package.json์„ ์ฐพ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

 

pnpm์˜ node_modules ๊ตฌ์กฐ:

node_modules/
โ”œโ”€โ”€ .pnpm/                    # ์‹ค์ œ ํŒจํ‚ค์ง€๋“ค์ด ์ €์žฅ๋˜๋Š” store
โ”‚   โ”œโ”€โ”€ next@16.1.1/
โ”‚   โ””โ”€โ”€ react@19.2.3/
โ””โ”€โ”€ next -> .pnpm/next@16.1.1/node_modules/next  # ์‹ฌ๋ณผ๋ฆญ ๋งํฌ

 

Turbopack์€ ์ด ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ œ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: turbopack.root ์„ค์ •

next.config.ts์— ๋ช…์‹œ์ ์œผ๋กœ workspace root๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  turbopack: {
    root: "..",  // ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ workspace root๋กœ ์ง€์ •
  },
  reactCompiler: true,
  output: "standalone",
};

export default nextConfig;

 

์ด์ œ Turbopack์ด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


4๋‹จ๊ณ„: Standalone ๋ชจ๋“œ์™€ ์ตœ์ ํ™”

Nginx ๋Œ€์‹  Next.js์˜ standalone ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์™œ Standalone์ธ๊ฐ€?

  1. Server-Side Rendering(SSR) ์ง€์›: Nginx๋Š” ์ •์  ํŒŒ์ผ๋งŒ ์„œ๋น™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, standalone์€ SSR๊ณผ API Routes๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค
  2. ์ตœ์†Œ ๋ฒˆ๋“ค ํฌ๊ธฐ: ํ•„์š”ํ•œ ์˜์กด์„ฑ๋งŒ ํฌํ•จ๋œ ๊ฒฝ๋Ÿ‰ ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
  3. self-contained: Node.js๋งŒ ์žˆ์œผ๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ์ ์ธ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค
// next.config.ts
const nextConfig: NextConfig = {
  output: "standalone",  // ์ด ํ•œ ์ค„์ด ๋งˆ๋ฒ•์„ ์ผ์œผํ‚ต๋‹ˆ๋‹ค
};

Standalone ๋นŒ๋“œ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ

frontend/.next/
โ”œโ”€โ”€ standalone/          # ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„
โ”‚   โ”œโ”€โ”€ server.js       # ์ง„์ž…์ 
โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ””โ”€โ”€ node_modules/   # ํ•„์š”ํ•œ ์˜์กด์„ฑ๋งŒ (์‹ฌ๋ณผ๋ฆญ ๋งํฌ)
โ””โ”€โ”€ static/             # ์ •์  ์ž์‚ฐ๋“ค

5๋‹จ๊ณ„: ์ตœ์ข… Dockerfile - Multi-stage Build

์ด์ œ ๋ชจ๋“  ํผ์ฆ ์กฐ๊ฐ์„ ๋งž์ถฐ๋ด…์‹œ๋‹ค.

# Stage 1: Dependencies
FROM node:22-alpine AS deps
RUN corepack enable && corepack prepare pnpm@latest --activate
WORKDIR /app

# Copy root workspace files
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
COPY packages ./packages

# Copy frontend package.json
COPY frontend/package.json ./frontend/

# Install dependencies
RUN pnpm install --frozen-lockfile --filter frontend...

# Stage 2: Builder
FROM node:22-alpine AS builder
RUN corepack enable && corepack prepare pnpm@latest --activate
WORKDIR /app

# Build arguments for Next.js environment variables
ARG NEXT_PUBLIC_API_URL
ARG NEXT_PUBLIC_API_MODE

# Copy dependencies from deps stage
COPY --from=deps /app/node_modules ./node_modules
COPY --from=deps /app/frontend/node_modules ./frontend/node_modules
COPY --from=deps /app/packages ./packages

# Copy source files
COPY frontend ./frontend
COPY pnpm-workspace.yaml package.json ./

# Build application
WORKDIR /app/frontend
RUN pnpm build

# Stage 3: Production with Node.js (for standalone Next.js)
FROM node:22-alpine AS runner
WORKDIR /app

ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

# standalone์€ ํ•„์š”ํ•œ ๋ชจ๋“  ์˜์กด์„ฑ์„ ์ด๋ฏธ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ
# ์ „์ฒด standalone ๊ตฌ์กฐ๋ฅผ ๋ณต์‚ฌ
COPY --from=builder --chown=nextjs:nodejs /app/frontend/.next/standalone ./

# static ํŒŒ์ผ๋“ค์„ ์˜ฌ๋ฐ”๋ฅธ ์ค‘์ฒฉ ๊ฒฝ๋กœ์— ๋ณต์‚ฌ
COPY --from=builder --chown=nextjs:nodejs /app/frontend/.next/static ./frontend/.next/static
COPY --from=builder --chown=nextjs:nodejs /app/frontend/public ./frontend/public

USER nextjs

EXPOSE 3000

ENV PORT=3000
ENV HOSTNAME="0.0.0.0"

# frontend ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด์„œ server.js ์‹คํ–‰
WORKDIR /app/frontend
CMD ["node", "server.js"]

๐ŸŽจ ์•„ํ‚คํ…์ฒ˜ ์„ค๋ช…

Stage 1 (deps): ์˜์กด์„ฑ๋งŒ ์„ค์น˜

  • ๋นŒ๋“œ ์บ์‹ฑ ์ตœ์ ํ™”: package.json์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ด ๋ ˆ์ด์–ด๋ฅผ ์žฌ์‚ฌ์šฉ
  • --filter frontend...๋กœ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋งŒ ์„ค์น˜

Stage 2 (builder): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ

  • ์†Œ์Šค ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์˜์กด์„ฑ ์„ค์น˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ
  • ARG๋กœ ๋นŒ๋“œ ํƒ€์ž„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž… ๊ฐ€๋Šฅ

Stage 3 (runner): ํ”„๋กœ๋•์…˜ ์‹คํ–‰

  • ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ๋งŒ ๋ณต์‚ฌํ•˜์—ฌ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ตœ์†Œํ™”
  • non-root ์‚ฌ์šฉ์ž(nextjs)๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”
  • standalone ์ถœ๋ ฅ๋ฌผ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€

6๋‹จ๊ณ„: ๋นŒ๋“œ ์ตœ์ ํ™” - .dockerignore

๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„ ์ œ์™ธํ•˜์—ฌ ๋นŒ๋“œ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

# .dockerignore
node_modules
.next
.git
.gitignore
README.md
.env*.local
.DS_Store
*.md

์‹คํ–‰ ๋ฐ ๊ฒ€์ฆ

๋นŒ๋“œ

docker build -f frontend/Dockerfile -t beastcamp-frontend .

์‹คํ–‰

docker run -d \
  --name frontend \
  -p 3000:3000 \
  -e NEXT_PUBLIC_API_URL=https://api.example.com \
  beastcamp-frontend

๊ฒ€์ฆ

$ docker logs -f frontend
   โ–ฒ Next.js 16.1.1
   - Local:        http://localhost:3000
   - Network:      http://0.0.0.0:3000

 โœ“ Starting...
 โœ“ Ready in 89ms

$ curl -I http://localhost:3000
HTTP/1.1 200 OK
x-powered-by: Next.js

 


์ฃผ์š” ๊ตํ›ˆ (Key Takeaways)

1. Turbopack๊ณผ pnpm์˜ ๊ถํ•ฉ ๋ฌธ์ œ

  • Next.js 16์˜ Turbopack์€ pnpm์˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํžˆ ์ง€์›ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค
  • turbopack.root ์„ค์ •์œผ๋กœ workspace root๋ฅผ ๋ช…์‹œํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค

2. Standalone ๋ชจ๋“œ์˜ ์žฅ์ 

  • SSR/ISR์„ ์ง€์›ํ•˜๋Š” ์™„์ „ํ•œ ์„œ๋ฒ„
  • ์ตœ์†Œํ•œ์˜ ์˜์กด์„ฑ๋งŒ ํฌํ•จ๋˜์–ด ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ตœ์†Œํ™”
  • Nginx ์„ค์ • ์—†์ด ๋ฐ”๋กœ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ๊ฐ€๋Šฅ

3. Multi-stage Build์˜ ์ค‘์š”์„ฑ

  • ์˜์กด์„ฑ ์„ค์น˜์™€ ๋นŒ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ ๊ทน๋Œ€ํ™”
  • ์ตœ์ข… ์ด๋ฏธ์ง€์—๋Š” ์‹คํ–‰์— ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ํฌํ•จ

4. pnpm Workspace ํ•„ํ„ฐ๋ง

  • --filter frontend...๋Š” ์„ธ ๊ฐœ์˜ ์ (...)์ด ํ•ต์‹ฌ
  • ํ•ด๋‹น ํŒจํ‚ค์ง€์™€ ๊ทธ๊ฒƒ์ด ์˜์กดํ•˜๋Š” ๋ชจ๋“  workspace ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จ

5. ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

  • non-root ์‚ฌ์šฉ์ž๋กœ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
  • ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋นŒ๋“œ ์•„๊ทœ๋จผํŠธ๋‚˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ฃผ์ž…
  • .dockerignore๋กœ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ๋…ธ์ถœ ๋ฐฉ์ง€

์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ

ํ•ญ๋ชฉ ์ˆ˜์น˜
์ตœ์ข… ์ด๋ฏธ์ง€ ํฌ๊ธฐ ~180MB (alpine ๊ธฐ๋ฐ˜)
๋นŒ๋“œ ์‹œ๊ฐ„ (์บ์‹œ ์—†์Œ) ~3๋ถ„
๋นŒ๋“œ ์‹œ๊ฐ„ (์บ์‹œ ์žˆ์Œ) ~15์ดˆ
์‹œ์ž‘ ์‹œ๊ฐ„ ~90ms
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ~150MB (์œ ํœด ์ƒํƒœ)

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ฐ€์ด๋“œ

Q: "Cannot find module 'next'" ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค

์›์ธ: standalone ๋นŒ๋“œ์˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ์ œ๋Œ€๋กœ ๋ณต์‚ฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ:

# standalone ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ๋ณต์‚ฌ
COPY --from=builder /app/frontend/.next/standalone ./

Q: ๋นŒ๋“œ๋Š” ๋˜๋Š”๋ฐ ์‹คํ–‰ ์‹œ 404๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค

์›์ธ: static ํŒŒ์ผ๋“ค์ด ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ์— ๋ณต์‚ฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ:

# ์ค‘์ฒฉ๋œ ๊ฒฝ๋กœ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€
COPY --from=builder /app/frontend/.next/static ./frontend/.next/static
COPY --from=builder /app/frontend/public ./frontend/public

Q: ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์›์ธ: NEXT_PUBLIC_* ๋ณ€์ˆ˜๋Š” ๋นŒ๋“œ ์‹œ์ ์— ๋ฒˆ๋“ค์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ:

ARG NEXT_PUBLIC_API_URL
# ๋นŒ๋“œ ์‹œ ์ „๋‹ฌ: docker build --build-arg NEXT_PUBLIC_API_URL=...

๋งˆ์น˜๋ฉฐ

Next.js 16์˜ Turbopack๊ณผ pnpm ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ Docker๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •์€ ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ–ˆ์ง€๋งŒ, ๊ฐ ๋ฌธ์ œ์˜ ์›์ธ์„ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋‹ˆ ํ•ด๊ฒฐ์ฑ…์ด ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ์€ Turbopack์˜ workspace root ์„ค์ •๊ณผ standalone ๋ชจ๋“œ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์œ ์ง€์˜€์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์ด ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ๋ถ„๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์งˆ๋ฌธ์ด๋‚˜ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ํ”ผ๋“œ๋ฐฑ ์ฃผ์„ธ์š”!


์ฐธ๊ณ  ์ž๋ฃŒ

  • Next.js Standalone Output
  • pnpm Workspace Filtering
  • Turbopack Configuration
  • Docker Multi-stage Builds

 

'๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React ์„ฑ๋Šฅ ์ตœ์ ํ™”  (0) 2026.01.20
CSR / SSR / SSG / ISR ๋ Œ๋”๋ง ๋ฐฉ์‹ ๋น„๊ต  (1) 2026.01.17
์ง€๋„ ๋ทฐํฌํŠธ ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ˆ™์†Œ ๊ฒ€์ƒ‰ ๊ตฌํ˜„  (0) 2026.01.14
์›น ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ: Transition, Keyframes, rAF, WAAPI ๋น„๊ต์™€ ํ™œ์šฉ๋ฒ•  (0) 2025.09.24
Webpack Tree Shaking ๋™์ž‘ ์›๋ฆฌ  (0) 2025.09.17
'๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • React ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • CSR / SSR / SSG / ISR ๋ Œ๋”๋ง ๋ฐฉ์‹ ๋น„๊ต
  • ์ง€๋„ ๋ทฐํฌํŠธ ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ˆ™์†Œ ๊ฒ€์ƒ‰ ๊ตฌํ˜„
  • ์›น ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ: Transition, Keyframes, rAF, WAAPI ๋น„๊ต์™€ ํ™œ์šฉ๋ฒ•
์—ฐ์žŽ(lotus leaf)
์—ฐ์žŽ(lotus leaf)
  • ์—ฐ์žŽ(lotus leaf)
    lotus' s develog ๐Ÿƒ
    ์—ฐ์žŽ(lotus leaf)
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (79)
      • โœ๏ธ ๊ฐœ๋ฐœํšŒ๊ณ ๋ก (5)
      • ๐Ÿงฎ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (3)
      • ๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE) (19)
        • HTML (0)
        • CSS (0)
        • Javascript (0)
        • React (0)
        • Next.js (0)
        • webpack & babel (0)
      • ๐Ÿ’ป ๋ฐฑ์—”๋“œ(BE) (2)
        • Nest.js (0)
        • Express.js (0)
        • MySQL (1)
      • โš™๏ธ ์ธํ”„๋ผ(Devops) (2)
      • ๐Ÿค– AI (1)
      • ๐ŸŒ WEB (8)
      • ๐Ÿ’ป CS (16)
        • ์ž๋ฃŒ๊ตฌ์กฐ (0)
        • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (1)
        • ์šด์˜์ฒด์ œ (0)
        • ์ธ๊ณต์ง€๋Šฅ (8)
        • ์›น ๋ณด์•ˆ (1)
        • ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… (6)
      • ๐Ÿ–‹๏ธ DevLog (1)
      • ๐Ÿฆพ ๋กœ๋ณดํ‹ฑ์Šค (4)
      • ๐Ÿ“— ๋„ค์ด๋ฒ„๋ถ€์ŠคํŠธ์บ ํ”„ ์›น ๋ชจ๋ฐ”์ผ (0)
      • ๐ŸŽฎ Unity(C#) (10)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (4)
        • C (4)
        • C++ (0)
        • Java (0)
        • Python (0)
      • MSA (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    soft margin svm
    ํŒŒ์ผํŠธ๋ฆฌ
    Devops #๋Œ€๊ทœ๋ชจํŠธ๋ž˜ํ”ฝ์ฒ˜๋ฆฌ
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ๋ฆฌ์•กํŠธ
    AWS
    isaac automator
    client-streaming
    c์–ธ์–ด
    ์ดํ™”์—ฌ์ž๋Œ€ํ•™๊ต #๋„์ „ํ•™๊ธฐ์ œ
    advaned detail
    c++
    ์ˆœ์—ด
    gaussian rbf svm
    ์กฐํ•ฉ
    ๋ฐฑ์ค€
    ros workspace
    hard margin svm
    ์ŠคํŒธ๋ถ„๋ฅ˜๊ธฐ
    ์ฝ”๋”ํŒจ๋“œ
    C
    ๊ธฐ์ดˆ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์ŠคํŒธ๋ฉ”์ผ๋ถ„๋ฅ˜๊ธฐ
    C#
    auto-scaling
    nav2
    next.js12
    turtlebot
    ros bridge
    deploy-aws
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
์—ฐ์žŽ(lotus leaf)
Next.js 16 + Turbopack + pnpm ๋ชจ๋…ธ๋ ˆํฌ: Docker ๋นŒ๋“œ ์™„์ „ ์ •๋ณต
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”