gemai / Dockerfile
victorgg's picture
Create Dockerfile
64dbd3a verified
# 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 အတိုင်း)
# --- မှတ်ချက်များ အဆုံး ---