71 lines
2.9 KiB
Docker
71 lines
2.9 KiB
Docker
# syntax=docker/dockerfile:1.6
|
|
|
|
########## Base (apk + common tools ติดตั้งตอน build) ##########
|
|
FROM node:20-alpine AS base
|
|
WORKDIR /app
|
|
RUN apk add --no-cache bash curl tzdata python3 make g++ \
|
|
&& ln -snf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime \
|
|
&& echo "Asia/Bangkok" > /etc/timezone
|
|
ENV TZ=Asia/Bangkok APP_HOME=/app RUNTIME_HOME=/opt/runtime
|
|
|
|
########## Deps สำหรับ Production (no devDeps) ##########
|
|
FROM base AS deps-prod
|
|
WORKDIR /work
|
|
COPY package*.json ./
|
|
RUN npm ci --omit=dev || npm install --omit=dev
|
|
RUN mkdir -p ${RUNTIME_HOME} && mv node_modules ${RUNTIME_HOME}/node_modules
|
|
|
|
########## Deps สำหรับ Development (รวม devDeps) ##########
|
|
FROM base AS deps-dev
|
|
RUN apk add --no-cache git openssh-client ca-certificates
|
|
WORKDIR /work
|
|
COPY package*.json ./
|
|
RUN npm ci || npm install
|
|
RUN mkdir -p ${RUNTIME_HOME} && mv node_modules ${RUNTIME_HOME}/node_modules
|
|
|
|
########## Runtime: Development ##########
|
|
FROM base AS dev
|
|
WORKDIR /app
|
|
# ทำงานเป็น root ชั่วคราวเพื่อจัดสิทธิ์/ลิงก์ แล้วค่อยเปลี่ยนเป็น node
|
|
# 1) คัดลอก deps dev
|
|
COPY --from=deps-dev /opt/runtime/node_modules /opt/runtime/node_modules
|
|
|
|
# 2) สร้าง symlink /app/node_modules → /opt/runtime/node_modules (กันปัญหา NODE_PATH/permission)
|
|
RUN ln -sfn /opt/runtime/node_modules /app/node_modules \
|
|
&& chown -R node:node /app
|
|
|
|
# 3) ใส่สคริปต์ start-dev แล้วค่อยสลับ USER
|
|
COPY --chown=node:node ./start-dev.sh /app/start-dev.sh
|
|
RUN chmod +x /app/start-dev.sh
|
|
USER node
|
|
|
|
# ให้หา nodemon ได้จาก node_modules/.bin ที่ bake มาแล้ว
|
|
# ENV NODE_ENV=development PATH="/opt/runtime/node_modules/.bin:${PATH}"
|
|
# ให้หา nodemon ได้ และระบุพอร์ตดีฟอลต์
|
|
ENV NODE_ENV=development \
|
|
PORT=3001 \
|
|
PATH="/opt/runtime/node_modules/.bin:${PATH}"
|
|
|
|
EXPOSE 3001 9229
|
|
HEALTHCHECK --interval=15s --timeout=5s --retries=10 \
|
|
CMD wget -qO- http://127.0.0.1:3001/health || exit 1
|
|
# HEALTHCHECK --interval=15s --timeout=5s --retries=10 CMD curl -fsS http://127.0.0.1:7001/health || exit 1
|
|
CMD ["/app/start-dev.sh"]
|
|
|
|
########## Runtime: Production ##########
|
|
FROM base AS prod
|
|
WORKDIR /app
|
|
ENV NODE_ENV=production
|
|
# ใส่ deps สำหรับ prod
|
|
COPY --from=deps-prod /opt/runtime/node_modules /opt/runtime/node_modules
|
|
# สร้าง symlink เช่นกัน เพื่อให้ Node resolve deps ได้จาก /app เหมือน dev
|
|
RUN ln -sfn /opt/runtime/node_modules /app/node_modules
|
|
# ใส่ซอร์ส (prod ไม่ bind โค้ด)
|
|
COPY . .
|
|
USER node
|
|
EXPOSE 3001
|
|
HEALTHCHECK --interval=30s --timeout=5s --retries=10 \
|
|
CMD wget -qO- http://127.0.0.1:3001/health || exit 1
|
|
CMD ["node","src/index.js"]
|
|
|