Summary of Creating Dockerfile - Kanapakan/MoodMent-Project-SW-dev-tool GitHub Wiki

Frontend

FROM node:lts-alpine AS builder
WORKDIR /usr/src/front-end
COPY package.json .
RUN yarn install
COPY . .
RUN ["yarn", "build"]

FROM nginx:1.14.2-alpine AS production
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=0 /usr/src/front-end/build /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

มีการทำ Multi-stages builds โดยแบ่ง Dockerfile เป็น 2 ส่วน คือ ส่วนสำหรับ Build และ ส่วนที่คัดลอกไฟล์ที่ Build นั้นไปใช้งาน

ส่วนสำหรับ Build

FROM node:lts-alpine AS builder
  • เป็นคำสั่งเพื่อเรียกใช้ Base Image สำหรับงานที่ทำงานด้วย NodeJS จาก DockerHub ที่รันด้วย Alpine Linux long term support version
WORKDIR /usr/src/front-end
  • เป็นคำสั่งเพื่อกำหนด Work Directory เพื่อให้คำสั่งอื่น ๆ ที่จะทำการรันต่อจากนี้ถูกรันที่ Directory usr/src/front-end
COPY package.json .
  • เป็นคำสั่งเพื่อคัดลอกทุกอย่างที่อยู่ในไฟล์ package.json ไปยัง Work Directory
RUN yarn install
  • เป็นคำสั่งเพื่อให้รัน yarn install เพื่อติดตั้งสิ่งที่อยู่ในไฟล์ package.json ที่ถูกคัดลอกมาอยู่ใน Work Directory ที่ชื่อว่า front-end
COPY . .
  • เป็นคำสั่งเพื่อคัดลอกทุกไฟล์ไปยัง image ที่อยู่ในโฟลเดอร์ usr/src/front-end
RUN ["yarn", "build"]
  • เป็นคำสั่งเพื่อให้ build

ส่วนที่ใช้งาน

FROM nginx:1.14.2-alpine AS production
  • เป็นคำสั่งเพื่อเรียกใช้ Base Image สำหรับงานที่ทำงานด้วย nginx จาก DockerHub ที่รันด้วย Alpine Linux version1.14.2
COPY nginx.conf /etc/nginx/conf.d/default.conf
  • เป็นคำสั่งเพื่อคัดลอกไฟล์ nginx config ไปยัง Destination Folder
COPY --from=0 /usr/src/front-end/build /usr/share/nginx/html
  • เป็นคำสั่งเพื่อคัดลอกไฟล์ที่เรา build ไว้แล้วมายัง image ที่สอง
CMD ["nginx", "-g", "daemon off;"]
  • เป็น Execute Command เพื่อใช้ nginx ในการรันโดยไม่ให้รันที่ Background

Backend

FROM node:lts-alpine AS development
WORKDIR /usr/src/app
COPY package.json ./
RUN yarn add @nestjs/cli
RUN yarn install
COPY . .
RUN ["yarn", "run", "build"]

FROM node:lts-alpine AS production
WORKDIR /usr/src/app
COPY package.json ./
RUN yarn install --production
COPY --from=development /usr/src/app/dist ./dist
CMD ["node", "dist/main"]

มีการทำ Multi-stages builds โดยแบ่ง Dockerfile เป็น 2 ส่วน คือ ส่วนสำหรับ Build และ ส่วนที่คัดลอกไฟล์ที่ Build นั้นไปใช้งาน

ส่วนสำหรับ Build

FROM node:lts-alpine AS builder
  • เป็นคำสั่งเพื่อเรียกใช้ Base Image สำหรับงานที่ทำงานด้วย NodeJS จาก DockerHub ที่รันด้วย Alpine Linux long term support version
WORKDIR /usr/src/app
  • เป็นคำสั่งเพื่อกำหนด Work Directory เพื่อให้คำสั่งอื่น ๆ ที่จะทำการรันต่อจากนี้ถูกรันที่ Directory /usr/src/app
COPY package.json ./
  • เป็นคำสั่งเพื่อคัดลอกทุกอย่างที่อยู่ในไฟล์ package.json ไปยัง Work Directory
RUN yarn install --production
  • เป็นคำสั่งเพื่อให้รัน yarn install เพื่อติดตั้ง dependencies ตามไฟล์ package.json
COPY . .
  • เป็นคำสั่งเพื่อคัดลอกทุกไฟล์ไปยัง image
RUN ["yarn", "run", "build"]
  • เป็นคำสั่งเพื่อให้ build

ส่วนที่ใช้งาน

FROM node:lts-alpine AS production
  • เป็นคำสั่งเพื่อเรียกใช้ Base Image สำหรับงานที่ทำงานด้วย NodeJS จาก DockerHub ที่รันด้วย Alpine Linux long term support version
WORKDIR /usr/src/app
  • เป็นคำสั่งเพื่อกำหนด Work Directory เพื่อให้คำสั่งอื่น ๆ ที่จะทำการรันต่อจากนี้ถูกรันที่ Directory /usr/src/app
COPY package.json ./
  • เป็นคำสั่งเพื่อคัดลอกทุกอย่างที่อยู่ในไฟล์ package.json ไปยัง Work Directory
RUN yarn install --production
  • เป็นคำสั่งเพื่อให้รัน yarn install เพื่อติดตั้ง dependencies ตามไฟล์ package.json ยกเว้นส่วนที่เป็น devDependencies
COPY --from=development /usr/src/app/dist ./dist
  • เป็นคำสั่งเพื่อให้ copy ไฟล์ที่เราทำการ build ไว้แล้วมายัง image ที่ใช้งาน
CMD ["node", "dist/main"]
  • เป็น execute command เพื่อใช้ node รันไฟล์ main.js ในโฟลเดอร์ dist