Deploy Node.js + Puppeteer ด้วย Docker ภายใน 5 นาที

NottDev
3 min readJun 5, 2021

--

สำหรับบทความนี้เกี่ยวกับการ Setup โปรเจค Node.js + Puppeteer ให้สามารถรันบน Docker ได้ และการตั้งค่า Puppeteer ให้สามารถใช้งานบน Linux (No GUI)โดยจะขอไม่ลงรายละเอียดเกี่ยวกับการติดตั้งและใช้งาน puppeteer ใน Node.js จะเน้นไปที่การสร้าง Dockerfile และ Compose file เพื่อนำไปใช้งาน ซึ่งหากต้องการศึกษาเกี่ยวกับการใช้งาน Puppeteer สามารถกดลิงค์ด้านล่าง เพื่อไปอ่านทำความเข้าใจพื้นฐานก่อนได้ครับ

เนื้อหาประกอบด้วย ​4 ส่วน ดังนี้

  1. ตั้งค่า Node.js + Puppeteer สำหรับรันบน Linux (No GUI)
  2. สร้าง Dockerfile
  3. สร้าง Compose file
  4. ทดสอบรัน บน 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-network
networks:
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
docker-compose up -d — build
created container success
docker-compose ps
Response package puppeteer detail

หากสำเร็จจะปรากฏเป็นข้อมูลรายละเอียดของ package puppeteer จากหน้าเว็บ npmjs.com เรื่องจากตัวอย่างข้างต้นจะเป็นการเขียน API ไปดึงข้อมูลจากหน้าเว็บมาแสดงนั้นเอง ซึ่งสามารถเข้าไปตัวอย่างโค๊ดเพิ่มเติมได้จาก Source code นี้

เป็นอันเสร็จพิธีสำหรับการ Setup โปรเจค Node.js + Puppeteer ให้สามารถรันบน Docker ได้ และการตั้งค่า Puppeteer ให้สามารถใช้งานบน Linux (No GUI) ถ้าหากต้องการศึกษาเพิ่มเติมเกี่ยวกับ Puppeteer หรือ Docker สามารถเข้าไปที่เว็บไซต์ Official ได้เลย สุดท้ายนี้ก็หวังว่าบทความนี้คงเป็นประโยชน์สำหรับใครที่กำลังสนใจ หรือติดปัญหาเรื่องนี้อยู่ไม่มากก็น้อย สำหรับวันนี้ต้องขอตัวลาไปก่อน สวัสดีครับ ^^

--

--

NottDev
NottDev

Written by NottDev

Your only limit is your mind.

No responses yet