สำหรับบทความนี้เกี่ยวกับการ Setup โปรเจค Node.js + Puppeteer ให้สามารถรันบน Docker ได้ และการตั้งค่า Puppeteer ให้สามารถใช้งานบน Linux (No GUI)โดยจะขอไม่ลงรายละเอียดเกี่ยวกับการติดตั้งและใช้งาน puppeteer ใน Node.js จะเน้นไปที่การสร้าง Dockerfile และ Compose file เพื่อนำไปใช้งาน ซึ่งหากต้องการศึกษาเกี่ยวกับการใช้งาน Puppeteer สามารถกดลิงค์ด้านล่าง เพื่อไปอ่านทำความเข้าใจพื้นฐานก่อนได้ครับ
เนื้อหาประกอบด้วย 4 ส่วน ดังนี้
- ตั้งค่า Node.js + Puppeteer สำหรับรันบน Linux (No GUI)
- สร้าง Dockerfile
- สร้าง Compose file
- ทดสอบรัน บน Docker
เริ่มจาก ตั้งค่า Node.js + Puppeteer สำหรับรันบน Linux (No GUI)
ส่วนนี้ผมได้สร้างไว้แล้ว สามารถโหลด Source Code สำหรับดูเป็นตัวอย่างได้เลย ซึ่งส่วนนี้ได้ต่อยอดมาจากบทความก่อนหน้า ทำ Automation หน้าเว็บด้วย Puppeteer
โดยจุดสำคัญสำหรับการ deploy Node.js + Puppeteer สำหรับรันบน Linux (No GUI) นั้น เราต้องใส่ option args: [‘ — no-sandbox’, ‘ — disable-setuid-sandbox’] ในตอนที่เรียกใช้ฟังก์ชั่น puppeteer.launch ด้วย ดังโค๊ดด้านล่าง
const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'],});--no-sandbox :ระบุว่าไม่ใช้ sandbox
--disable-setuid-sandbox :ระบุว่าไม่ใช้ setuid-sandbox
**เพิ่มเติม
Chrome ใช้ multiple layers of sandboxing เพื่อช่วยให้สามารถให้สิทธิ์และข้อจำกัดต่างๆ กับส่วนต่างๆ ของเบราว์เซอร์ได้ แต่หากเราไม่ต้องใช้งานส่วนนี้ก็สามารถปิดไปได้ โดยการระบุ — no-sandbox และ — disable-setuid-sandbox
สร้าง Dockerfile
ส่วนนี้ให้เราสร้างไฟล์ชื่อ Dockerfile จากนั้นเขียนโค๊ด ดังตัวอย่างด้านล่าง
FROM node:12-slim# install dependencies
RUN apt-get update \
&& apt-get install -y wget gnupg \
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
&& apt-get update \
&& apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*WORKDIR /appCOPY ./package.json /app
RUN npm install
COPY ./ ./CMD ["npm", "start"]
จาก Dockerfile ข้างต้น ใช้ node image เวอร์ชั่น 12-slim ต่อมาเป็นการติดตั้ง dependcies ต่างๆที่ใช้ ซึ่งพระเอกของเราก็คือ google-chrome-stable ติดตั้ง google chrome เพื่อให้สามารถใช้งาน puppeteer ได้นั้นเอง และส่วนถัดมาคือการติดตั้ง package.json และคัดลอกโค๊ดทั้งหมดเข้า container ส่วนสุดท้ายคือสั่งรันคำสั่ง npm start เพื่อ Start node.js server
google-chrome-stable คือ แพ็คเกจสำหรับติดตั้ง Google Chrome บน Linux
สร้าง Compose file
ส่วนนี้ให้เราสร้างไฟล์ชื่อ docker-compose.yml จากนั้นเขียนโค๊ด ดังตัวอย่างด้านล่าง
version: "3.8"services:
nodejs:
container_name: nodejs_puppeteer_server
build:
dockerfile: Dockerfile
context: ./
ports:
- "${PORT}:${PORT}"
networks:
- puppeteer-networknetworks:
puppeteer-network:
name: puppeteer-network
จากไฟล์ docker-compose ข้างต้น ใช้ compose file เวอร์ชั่น 3.8 (เวอร์ชั่นล่าสุด) โดยระบุชื่อ container ว่า “nodejs_puppeteer_server” และระบุให้ build ด้วย Dockerfile ที่ path ปัจจุบัน และ กำหนด network ให้กับ container ซึ่งส่วนนี้ไม่จำเป็นต้องระบุก็ได้ หากไม่ระบุ docker จะกำหนดค่า default ให้ โดยจะตั้งชื่อตามรูปแบบนี้ <folder_project>_default
docker-compose คือคำสั่งที่เอาไว้สร้าง container หลายๆอันขึ้นมาพร้อมกัน
ทดสอบรัน บน Docker
หาก Clone Source Code จากลิงค์นี้มา ให้เริ่มจากขั้นตอนดังนี้
- สร้างไฟล์ .env
PORT=3000
API_VERSION=1
- รัน docker-compose เพื่อสร้าง Container
$ docker-compose up -d --build
- เปิดเบราว์เซอร์เข้าลิงค์ http://localhost:3000/api/v1/puppeteer
หากสำเร็จจะปรากฏเป็นข้อมูลรายละเอียดของ package puppeteer จากหน้าเว็บ npmjs.com เรื่องจากตัวอย่างข้างต้นจะเป็นการเขียน API ไปดึงข้อมูลจากหน้าเว็บมาแสดงนั้นเอง ซึ่งสามารถเข้าไปตัวอย่างโค๊ดเพิ่มเติมได้จาก Source code นี้
เป็นอันเสร็จพิธีสำหรับการ Setup โปรเจค Node.js + Puppeteer ให้สามารถรันบน Docker ได้ และการตั้งค่า Puppeteer ให้สามารถใช้งานบน Linux (No GUI) ถ้าหากต้องการศึกษาเพิ่มเติมเกี่ยวกับ Puppeteer หรือ Docker สามารถเข้าไปที่เว็บไซต์ Official ได้เลย สุดท้ายนี้ก็หวังว่าบทความนี้คงเป็นประโยชน์สำหรับใครที่กำลังสนใจ หรือติดปัญหาเรื่องนี้อยู่ไม่มากก็น้อย สำหรับวันนี้ต้องขอตัวลาไปก่อน สวัสดีครับ ^^
References: