| # Stage 1: Build the application (Builder Stage) | |
| # --------------------------------------------- | |
| # Node.js ရဲ့ Long Term Support (LTS) version တစ်ခုကို သုံးပါ။ Alpine က ပိုသေးပါတယ်။ | |
| # Alpine နဲ့ အဆင်မပြေရင် node:18-slim or node:20-slim ကို ပြောင်းသုံးနိုင်ပါတယ်။ | |
| FROM node:18-alpine AS builder | |
| # Container ထဲမှာ အလုပ်လုပ်မယ့် directory ကို သတ်မှတ်ပါ။ | |
| WORKDIR /app | |
| # Package Manager ကို သွင်းပါ (ဒီမှာ pnpm ကို နမူနာ ထားသုံးထားပါတယ်) | |
| # သင်က npm သို့မဟုတ် yarn သုံးတယ်ဆိုရင် ဒီအဆင့်ကို ကျော်နိုင်ပါတယ်၊ သို့မဟုတ် သက်ဆိုင်ရာ command ပြောင်းပါ။ | |
| RUN npm install -g pnpm | |
| # package.json နဲ့ lock file ကို copy ကူးပါ။ lock file က dependency version တွေ တိကျစေဖို့ အရေးကြီးပါတယ်။ | |
| COPY package.json pnpm-lock.yaml* ./ | |
| # --- အကယ်၍ npm သုံးလျှင် --- | |
| # COPY package.json package-lock.json* ./ | |
| # --- အကယ်၍ yarn သုံးလျှင် --- | |
| # COPY package.json yarn.lock* ./ | |
| # Dependencies တွေကို Install လုပ်ပါ။ --frozen-lockfile က lock file အတိုင်း တိတိကျကျ သွင်းပေးပါတယ်။ | |
| # Build အတွက် devDependencies တွေပါ လိုအပ်တာကြောင့် --prod=false ကို သုံးထားတာ ဒါမှမဟုတ် ဘာမှမထည့်ရင် default အတိုင်းရပါတယ်။ | |
| RUN pnpm install --frozen-lockfile --prod=false | |
| # --- အကယ်၍ npm သုံးလျှင် --- | |
| # RUN npm ci | |
| # --- အကယ်၍ yarn သုံးလျှင် --- | |
| # RUN yarn install --frozen-lockfile | |
| # ကျန်တဲ့ project code တွေကို အကုန် copy ကူးပါ။ | |
| COPY . . | |
| # (Optional) Build Time Environment Variables တွေ လိုအပ်ရင် ဒီမှာ သတ်မှတ်နိုင်ပါတယ်။ | |
| # ARG NEXT_PUBLIC_FOO | |
| # ENV NEXT_PUBLIC_FOO=$NEXT_PUBLIC_FOO | |
| # Next.js application ကို Production အတွက် Build လုပ်ပါ။ | |
| # *** အရေးကြီး ***: next.config.js မှာ output: 'standalone' ကို ထည့်ထားဖို့ အလွန် recommend လုပ်ပါတယ်။ | |
| # ဒါက Docker image ကို သေးငယ်စေပြီး လိုအပ်တာတွေပဲ ထည့်ပေးပါတယ်။ | |
| RUN pnpm build | |
| # --- အကယ်၍ npm သုံးလျှင် --- | |
| # RUN npm run build | |
| # --- အကယ်၍ yarn သုံးလျှင် --- | |
| # RUN yarn build | |
| # Stage 2: Production Image (Runner Stage) | |
| # ---------------------------------------- | |
| # ပိုသေးတဲ့ base image ကို ပြန်သုံးပါ။ Builder stage က image နဲ့ တူရုံ သို့မဟုတ် ပိုသေးရင် ကောင်းပါတယ်။ | |
| FROM node:18-alpine AS runner | |
| WORKDIR /app | |
| # Environment ကို Production လို့ သတ်မှတ်ပါ။ | |
| ENV NODE_ENV=production | |
| # Security အတွက် non-root user တစ်ယောက် ဖန်တီးပါ။ | |
| RUN addgroup --system --gid 1001 nodejs | |
| RUN adduser --system --uid 1001 nextjs | |
| # Builder stage ကနေ build လုပ်ပြီးသား လိုအပ်တဲ့ ဖိုင်တွေကိုပဲ ကူးယူပါ။ | |
| # (next.config.js မှာ output: 'standalone' သုံးထားတယ်လို့ ယူဆထားပါတယ်) | |
| # --chown=nextjs:nodejs က ဖိုင်ပိုင်ရှင်ကို ခုနက ဖန်တီးထားတဲ့ user အဖြစ် သတ်မှတ်ပေးပါတယ်။ | |
| COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ | |
| COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static | |
| COPY --from=builder --chown=nextjs:nodejs /app/public ./public | |
| # Non-root user အဖြစ် ပြောင်းသုံးပါ။ | |
| USER nextjs | |
| # App က run မယ့် port ကို သတ်မှတ်ပါ။ Next.js default က 3000 ပါ။ | |
| # Hugging Face Spaces က port mapping ကို သူ့ဘာသာ စီစဉ်ပေးပါလိမ့်မယ်။ | |
| EXPOSE 3000 | |
| # Default PORT ကို သတ်မှတ်ထားနိုင်ပါတယ်။ HF က ဒါကို override လုပ်နိုင်ပါတယ်။ | |
| ENV PORT=3000 | |
| # Application ကို စ run ပါ။ ('standalone' output အတွက် entry point က များသောအားဖြင့် server.js ပါ) | |
| CMD ["node", "server.js"] | |
| # --- Standalone Output မသုံးခဲ့လျှင် မှတ်ချက် --- | |
| # အကယ်၍ next.config.js မှာ output: 'standalone' မသုံးခဲ့ဘူးဆိုရင်: | |
| # 1. Runner stage မှာ Production dependencies တွေကို သီးသန့် install လုပ်ဖို့ လိုနိုင်ပါတယ်: | |
| # COPY --from=builder /app/package.json /app/pnpm-lock.yaml* ./ | |
| # RUN pnpm install --frozen-lockfile --prod=true | |
| # 2. ဖိုင်တွေကူးတဲ့အခါ .next/standalone အစား .next တစ်ခုလုံး၊ node_modules (အပေါ်က install မလုပ်ရင်)၊ package.json စတာတွေ ကူးဖို့လိုပါမယ်။ | |
| # COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next | |
| # COPY --from=builder --chown=nextjs:nodejs /app/public ./public | |
| # COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules | |
| # COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json | |
| # 3. CMD ကိုလည်း ပြောင်းဖို့လိုပါမယ်: | |
| # CMD ["pnpm", "start"] # သို့မဟုတ် npm start / yarn start (package.json ထဲက script အတိုင်း) | |
| # --- မှတ်ချက်များ အဆုံး --- | |