Javascript - Using chromedp/headless-shell Docker image for Puppeteer
Javascript - Using chromedp/headless-shell Docker image for Puppeteer
I had a personal project that made use of an awesome Puppeteer plugin called puppeteer-extra-plugin-portal by claabs. I wanted to create a Docker container that was small and found chromedp/headless-shell.
Sources
main.js
import puppeteer from 'puppeteer'; puppeteer.launch( { headless: true, args: [ "--disable-gpu", "--disable-dev-shm-usage", "--disable-setuid-sandbox", "--no-sandbox", ], }).then(async browser => { const page = await browser.newPage(); // further logic... } )
Not much difference from a regular Puppeteer setup
.dockerignore
.git *.log node_modules Dockerfile
We don't want node_modules folder especially as it might contain locally downloaded Chromium for development
Dockerfile
FROM chromedp/headless-shell ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ PUPPETEER_EXECUTABLE_PATH=/headless-shell/headless-shell COPY . /app WORKDIR /app RUN apt-get update && \ apt-get install -y tini curl && \ curl -fsSL https://deb.nodesource.com/setup_17.x | bash - && \ apt-get install -y nodejs && \ rm -rf /var/lib/apt/lists/* && \ npm install ENTRYPOINT ["tini", "--"] CMD ["/usr/bin/node main.js"]
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true is the most important to keep the image small
chromedp/headless-shell runs Debian and not Alpine for smaller image sadly, hence using apt, I might look into creating an automated build for Alpine images in the future