# syntax=docker/dockerfile:1.7 # ========================================================= # Base # ========================================================= FROM node:20-bookworm-slim AS base WORKDIR /app ENV NEXT_TELEMETRY_DISABLED=1 ENV HUSKY=0 # ========================================================= # Dependencies # ========================================================= FROM base AS deps ENV NODE_ENV=development ENV HUSKY=0 COPY package.json package-lock.json ./ RUN npm pkg delete scripts.prepare \ && npm ci --include=dev --no-audit --no-fund # ========================================================= # Next.js Builder # ========================================================= FROM base AS builder ENV NODE_ENV=production ENV BUILD_STANDALONE=true ENV NEXT_TELEMETRY_DISABLED=1 ENV HUSKY=0 ARG NEXT_PUBLIC_SENTRY_DISABLED=true ENV NEXT_PUBLIC_SENTRY_DISABLED=${NEXT_PUBLIC_SENTRY_DISABLED} COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build # ========================================================= # One-shot Migration / Seed Initializer # ========================================================= FROM base AS migrator ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 ENV HUSKY=0 COPY --from=deps /app/node_modules ./node_modules COPY package.json package-lock.json ./ COPY drizzle.config.* ./ COPY drizzle ./drizzle COPY src ./src COPY scripts ./scripts COPY tsconfig.json ./ # เพิ่ม directory อื่น หาก seed import ข้อมูลจากที่อื่น # COPY data ./data # COPY seeds ./seeds CMD ["sh", "-c", "\ set -eu; \ echo '========================================'; \ echo '1/3 Running database migrations'; \ echo '========================================'; \ npm run migrate; \ echo '========================================'; \ echo '2/3 Seeding master data'; \ echo '========================================'; \ npm run seed:master-data; \ echo '========================================'; \ echo '3/3 Seeding super administrator'; \ echo '========================================'; \ npm run seed:super-admin; \ echo '========================================'; \ echo 'Database initialization completed'; \ echo '========================================'; \ tail -f /dev/null \ "] # ========================================================= # Next.js Production Runner # ========================================================= FROM node:20-bookworm-slim AS runner WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 ENV PORT=3000 ENV HOSTNAME=0.0.0.0 ENV HOME=/home/nextjs RUN groupadd --system --gid 1001 nodejs \ && useradd \ --system \ --uid 1001 \ --gid nodejs \ --create-home \ nextjs COPY --from=builder --chown=nextjs:nodejs /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static RUN mkdir -p /app/storage \ && chown -R nextjs:nodejs /app/storage /home/nextjs USER nextjs EXPOSE 3000 CMD ["node", "server.js"]