Create Dockerfile
Browse files- Dockerfile +92 -0
Dockerfile
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Stage 1: Build the application (Builder Stage)
|
2 |
+
# ---------------------------------------------
|
3 |
+
# Node.js ရဲ့ Long Term Support (LTS) version တစ်ခုကို သုံးပါ။ Alpine က ပိုသေးပါတယ်။
|
4 |
+
# Alpine နဲ့ အဆင်မပြေရင် node:18-slim or node:20-slim ကို ပြောင်းသုံးနိုင်ပါတယ်။
|
5 |
+
FROM node:18-alpine AS builder
|
6 |
+
|
7 |
+
# Container ထဲမှာ အလုပ်လုပ်မယ့် directory ကို သတ်မှတ်ပါ။
|
8 |
+
WORKDIR /app
|
9 |
+
|
10 |
+
# Package Manager ကို သွင်းပါ (ဒီမှာ pnpm ကို နမူနာ ထားသုံးထားပါတယ်)
|
11 |
+
# သင်က npm သို့မဟုတ် yarn သုံးတယ်ဆိုရင် ဒီအဆင့်ကို ကျော်နိုင်ပါတယ်၊ သို့မဟုတ် သက်ဆိုင်ရာ command ပြောင်းပါ။
|
12 |
+
RUN npm install -g pnpm
|
13 |
+
|
14 |
+
# package.json နဲ့ lock file ကို copy ကူးပါ။ lock file က dependency version တွေ တိကျစေဖို့ အရေးကြီးပါတယ်။
|
15 |
+
COPY package.json pnpm-lock.yaml* ./
|
16 |
+
# --- အကယ်၍ npm သုံးလျှင် ---
|
17 |
+
# COPY package.json package-lock.json* ./
|
18 |
+
# --- အကယ်၍ yarn သုံးလျှင် ---
|
19 |
+
# COPY package.json yarn.lock* ./
|
20 |
+
|
21 |
+
# Dependencies တွေကို Install လုပ်ပါ။ --frozen-lockfile က lock file အတိုင်း တိတိကျကျ သွင်းပေးပါတယ်။
|
22 |
+
# Build အတွက် devDependencies တွေပါ လိုအပ်တာကြောင့် --prod=false ကို သုံးထားတာ ဒါမှမဟုတ် ဘာမှမထည့်ရင် default အတိုင်းရပါတယ်။
|
23 |
+
RUN pnpm install --frozen-lockfile --prod=false
|
24 |
+
# --- အကယ်၍ npm သုံးလျှင် ---
|
25 |
+
# RUN npm ci
|
26 |
+
# --- အကယ်၍ yarn သုံးလျှင် ---
|
27 |
+
# RUN yarn install --frozen-lockfile
|
28 |
+
|
29 |
+
# ကျန်တဲ့ project code တွေကို အကုန် copy ကူးပါ။
|
30 |
+
COPY . .
|
31 |
+
|
32 |
+
# (Optional) Build Time Environment Variables တွေ လိုအပ်ရင် ဒီမှာ သတ်မှတ်နိုင်ပါတယ်။
|
33 |
+
# ARG NEXT_PUBLIC_FOO
|
34 |
+
# ENV NEXT_PUBLIC_FOO=$NEXT_PUBLIC_FOO
|
35 |
+
|
36 |
+
# Next.js application ကို Production အတွက် Build လုပ်ပါ။
|
37 |
+
# *** အရေးကြီး ***: next.config.js မှာ output: 'standalone' ကို ထည့်ထားဖို့ အလွန် recommend လုပ်ပါတယ်။
|
38 |
+
# ဒါက Docker image ကို သေးငယ်စေပြီး လိုအပ်တာတွေပဲ ထည့်ပေးပါတယ်။
|
39 |
+
RUN pnpm build
|
40 |
+
# --- အကယ်၍ npm သုံးလျှင် ---
|
41 |
+
# RUN npm run build
|
42 |
+
# --- အကယ်၍ yarn သုံးလျှင် ---
|
43 |
+
# RUN yarn build
|
44 |
+
|
45 |
+
|
46 |
+
# Stage 2: Production Image (Runner Stage)
|
47 |
+
# ----------------------------------------
|
48 |
+
# ပိုသေးတဲ့ base image ကို ပြန်သုံးပါ။ Builder stage က image နဲ့ တူရုံ သို့မဟုတ် ပိုသေးရင် ကောင်းပါတယ်။
|
49 |
+
FROM node:18-alpine AS runner
|
50 |
+
|
51 |
+
WORKDIR /app
|
52 |
+
|
53 |
+
# Environment ကို Production လို့ သတ်မှတ်ပါ။
|
54 |
+
ENV NODE_ENV=production
|
55 |
+
|
56 |
+
# Security အတွက် non-root user တစ်ယောက် ဖန်တီးပါ။
|
57 |
+
RUN addgroup --system --gid 1001 nodejs
|
58 |
+
RUN adduser --system --uid 1001 nextjs
|
59 |
+
|
60 |
+
# Builder stage ကနေ build လုပ်ပြီးသား လိုအပ်တဲ့ ဖိုင်တွေကိုပဲ ကူးယူပါ။
|
61 |
+
# (next.config.js မှာ output: 'standalone' သုံးထားတယ်လို့ ယူဆထားပါတယ်)
|
62 |
+
# --chown=nextjs:nodejs က ဖိုင်ပိုင်ရှင်ကို ခုနက ဖန်တီးထားတဲ့ user အဖြစ် သတ်မှတ်ပေးပါတယ်။
|
63 |
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
64 |
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
65 |
+
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
|
66 |
+
|
67 |
+
# Non-root user အဖြစ် ပြောင်းသုံးပါ။
|
68 |
+
USER nextjs
|
69 |
+
|
70 |
+
# App က run မယ့် port ကို သတ်မှတ်ပါ။ Next.js default က 3000 ပါ။
|
71 |
+
# Hugging Face Spaces က port mapping ကို သူ့ဘာသာ စီစဉ်ပေးပါလိမ့်မယ်။
|
72 |
+
EXPOSE 3000
|
73 |
+
|
74 |
+
# Default PORT ကို သတ်မှတ်ထားနိုင်ပါတယ်။ HF က ဒါကို override လုပ်နိုင်ပါတယ်။
|
75 |
+
ENV PORT=3000
|
76 |
+
|
77 |
+
# Application ကို စ run ပါ။ ('standalone' output အတွက် entry point က များသောအားဖြင့် server.js ပါ)
|
78 |
+
CMD ["node", "server.js"]
|
79 |
+
|
80 |
+
# --- Standalone Output မသုံးခဲ့လျှင် မှတ်ချက် ---
|
81 |
+
# အကယ်၍ next.config.js မှာ output: 'standalone' မသုံးခဲ့ဘူးဆိုရင်:
|
82 |
+
# 1. Runner stage မှာ Production dependencies တွေကို သီးသန့် install လုပ်ဖို့ လိုနိုင်ပါတယ်:
|
83 |
+
# COPY --from=builder /app/package.json /app/pnpm-lock.yaml* ./
|
84 |
+
# RUN pnpm install --frozen-lockfile --prod=true
|
85 |
+
# 2. ဖိုင်တွေကူးတဲ့အခါ .next/standalone အစား .next တစ်ခုလုံး၊ node_modules (အပေါ်က install မလုပ်ရင်)၊ package.json စတာတွေ ကူးဖို့လိုပါမယ်။
|
86 |
+
# COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
|
87 |
+
# COPY --from=builder --chown=nextjs:nodejs /app/public ./public
|
88 |
+
# COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
|
89 |
+
# COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json
|
90 |
+
# 3. CMD ကိုလည်း ပြောင်းဖို့လိုပါမယ်:
|
91 |
+
# CMD ["pnpm", "start"] # သို့မဟုတ် npm start / yarn start (package.json ထဲက script အတိုင်း)
|
92 |
+
# --- မှတ်ချက်များ အဆုံး ---
|