38 lines
2.2 KiB
Text
38 lines
2.2 KiB
Text
|
|
# ─── Stage 1: ติดตั้ง dependencies (npm ci รวม postinstall คัดลอก pdf.worker) ───
|
||
|
|
FROM node:24-alpine AS deps
|
||
|
|
WORKDIR /app
|
||
|
|
COPY package.json package-lock.json ./
|
||
|
|
# postinstall เขียน public/pdf.worker.min.mjs — ต้องมีโฟลเดอร์ public/ ก่อน ไม่งั้น npm ci ล้ม
|
||
|
|
RUN mkdir -p public && npm ci
|
||
|
|
|
||
|
|
# ─── Stage 2: build Next.js (output: standalone) ───
|
||
|
|
FROM node:24-alpine AS builder
|
||
|
|
WORKDIR /app
|
||
|
|
COPY --from=deps /app/node_modules ./node_modules
|
||
|
|
COPY . .
|
||
|
|
# ประกันว่า pdf.worker.min.mjs ตรงกับเวอร์ชัน pdfjs-dist ใน node_modules เสมอ
|
||
|
|
# (postinstall รันใน stage deps ซึ่งยังไม่มี public/ ของ repo)
|
||
|
|
RUN node -e "require('fs').copyFileSync('node_modules/pdfjs-dist/build/pdf.worker.min.mjs','public/pdf.worker.min.mjs')"
|
||
|
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||
|
|
# db/index.ts throw ถ้าไม่มี DATABASE_URL ตอน next build เก็บ page data —
|
||
|
|
# ใส่ค่า dummy (postgres.js เชื่อมแบบ lazy ไม่มี query ตอน build) ตัวจริงฉีดตอน docker run
|
||
|
|
ENV DATABASE_URL=postgresql://placeholder:placeholder@127.0.0.1:5432/placeholder
|
||
|
|
RUN npm run build
|
||
|
|
|
||
|
|
# ─── Stage 3: runtime ตัวเบา (แค่ standalone + public/) ───
|
||
|
|
FROM node:24-alpine AS runner
|
||
|
|
WORKDIR /app
|
||
|
|
ENV NODE_ENV=production \
|
||
|
|
NEXT_TELEMETRY_DISABLED=1 \
|
||
|
|
PORT=3000 \
|
||
|
|
HOSTNAME=0.0.0.0
|
||
|
|
RUN addgroup -S nodejs && adduser -S nextjs -G nodejs
|
||
|
|
# Next 14.2 รวม public/ (pdf.worker, ฟอนต์ Sarabun, samples PDF) ไว้ใน standalone แล้ว
|
||
|
|
# แต่ไม่รวม .next/static (JS chunks) — ต้องคัดลอกเพิ่ม ไม่งั้นหน้าเว็บไม่มี JS
|
||
|
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||
|
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||
|
|
USER nextjs
|
||
|
|
EXPOSE 3000
|
||
|
|
# DATABASE_URL ฉีดตอนรันผ่าน env ของ container (อย่าฝังใน image)
|
||
|
|
CMD ["node", "server.js"]
|