# STAGE 1: build - สร้าง stage พื้นฐานสำหรับติดตั้ง dependencies ทั้งหมด # เราจะใช้ stage นี้เป็น cache ร่วมกันระหว่าง development และ production เพื่อความรวดเร็ว FROM node:20-alpine AS build # USER node WORKDIR /app # สร้าง user ไม่ใช่ root (ปลอดภัยขึ้น) # RUN addgroup -S dms && adduser -S dms -G dms # runtime tools + build deps ชั่วคราว (สำหรับ bcrypt ฯลฯ) #RUN apk add --no-cache curl \ # && apk add --no-cache --virtual build-deps python3 make g++ RUN apk add --no-cache --virtual build-deps python3 make g++ # COPY --chown=node:node package*.json package-lock.json* ./ # COPY package*.json package-lock.json* ./ # COPY package.json ./ # RUN (npm ci --omit=dev || npm install --omit=dev) # ติดตั้ง deps แบบ clean + ติดตั้ง dev tooling ที่จำเป็น # RUN npm ci --include=dev || npm install --include=dev && \ # npx --yes nodemon --version > /dev/null 2>&1 || npm i -D nodemon # RUN npm ci RUN npm install # คัดลอกโค้ด + ตั้ง owner/สิทธิ์ # COPY --chown=app:app src ./src # ไม่ COPY src เข้ามา — เราจะใช้ bind mount แทน # เพื่อ hot-reload จากโค้ดบน QNAP ได้ทันที # ลบ build deps ลดขนาดอิมเมจ # RUN apk del --no-network build-deps # STAGE 2: development - สำหรับการพัฒนาใน local โดยเฉพาะ # stage นี้จะใช้ dependencies ทั้งหมดจาก 'base' FROM base AS development # (ต้องมี script "dev" ใน package.json, เช่น "dev": "nodemon src/index.js") CMD ["npm", "run", "dev"] # ---------- Runtime stage ---------- FROM node:20-alpine AS production WORKDIR /app # สร้าง user และ group ที่ไม่ใช่ root สำหรับรันแอปพลิเคชัน RUN addgroup -S dms && adduser -S dms -G dms # COPY --from=build /app /app ENV NODE_ENV=production # คัดลอกไฟล์ package.json และ node_modules จาก stage 'base' COPY --from=build /app/package*.json ./ COPY --from=build /app/node_modules ./node_modules # ลบ devDependencies ที่ไม่จำเป็นสำหรับ production ออก RUN npm prune --production # เปลี่ยนไปใช้ user ที่ไม่ใช่ root USER dms EXPOSE 3001 CMD ["npm","start"] # backend/Dockerfile (Node.js ESM)