FROM node:20-alpine # สำหรับอ่านค่า .env ที่วางไว้ระดับ compose (ไม่ copy เข้า image) ENV NODE_ENV=production ENV TZ=Asia/Bangkok WORKDIR /app # สร้าง user ไม่ใช่ root (ปลอดภัยขึ้น) RUN addgroup -S app && adduser -S app -G app # runtime tools + build deps ชั่วคราว (สำหรับ bcrypt ฯลฯ) RUN apk add --no-cache curl \ && apk add --no-cache --virtual build-deps python3 make g++ # ติดตั้ง deps ของ npm (เช่น bcrypt ต้องมี python3/make/g++) # ใช้ virtual package ชื่อ build-deps (ไม่ต้องมีจุด) COPY package.json package-lock.json* ./ RUN (npm ci --omit=dev || npm install --omit=dev) # คัดลอกโค้ด + ตั้ง owner/สิทธิ์ COPY --chown=app:app src ./src # COPY src ./src # COPY app ./app # เตรียม logs + สิทธิ์อ่านไฟล์ใน /app RUN mkdir -p /app/logs \ && chown -R app:app /app/logs \ && chmod -R a+rX /app # ลบ build deps ลดขนาดอิมเมจ RUN apk del --no-network build-deps EXPOSE 3001 USER app CMD ["node", "src/index.js"] # backend/Dockerfile (Node.js ESM)