Hoe Puppeteer en Headless Chrome in een Docker-container te draaien?

0
209

Puppeteer is een Node.js-bibliotheek waarmee u kunt communiceren met het Chrome-web browser. Recente releases bevatten ook Firefox-ondersteuning.

Puppeteer wordt vaak gebruikt om testen te automatiseren, webpaginagegevens te archiveren en schermafbeeldingen van live webinhoud te genereren. Hiermee kun je Chrome bedienen via een duidelijke API, waardoor je naar pagina's kunt navigeren, op formulierbesturingselementen kunt klikken en browseropdrachten kunt geven.

Puppeteer laten draaien in een Docker-container kan complex zijn, aangezien er veel afhankelijkheden zijn nodig om headless Chrome uit te voeren. Hier leest u hoe u alles kunt installeren, zodat u Puppeteer kunt gebruiken in een Kubernetes-cluster, in een geïsoleerde container op uw ontwikkelmachine of als onderdeel van een CI-pipeline.

De basisvereisten

We gebruiken een op Debian gebaseerde afbeelding voor de doeleinden van dit artikel. Als u een andere basis gebruikt, moet u de weergegeven pakketbeheerder-commando's dienovereenkomstig aanpassen. De officiële Node.js-afbeelding is een geschikt startpunt, wat betekent dat u Node niet handmatig hoeft te installeren.

Puppeteer wordt gedistribueerd via npm, de pakketbeheerder van Node.js. Het bundelt de nieuwste build van Chromium in zijn pakket, dus theoretisch zou een npm-installatiepoppenspeler je aan de gang krijgen. In de praktijk zal een schone Docker-omgeving de afhankelijkheden missen die je nodig hebt om Chrome uit te voeren.

Advertentie

Omdat het gewoonlijk een zwaar GUI-programma is, is Chrome afhankelijk van bibliotheken voor lettertype, afbeeldingen, configuratie en vensterbeheer. Deze moeten allemaal in uw Dockerfile worden geïnstalleerd.

Op het moment van schrijven ziet de huidige afhankelijkheidslijst er als volgt uit:

FROM node: laatste WORKDIR /puppeteer RUN apt-get install -y fonts-liberation gconf-service libappindicator1 libasound2 libatk1.0-0 libcairo2 libcups2 libfontconfig1 libgbm-dev libgdk-pixbuf20-0. libgtk-3-0 libicu-dev libjpeg-dev libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libpng-dev libx11-6 libx11-xcb1 libxcb1 libxxcomposite1 libxxcomposite1or libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 xdg-utils

De afhankelijkheden worden handmatig geïnstalleerd om het gebruik van het Chromium-binaire bestand dat bij Puppeteer wordt geleverd, te vergemakkelijken. Dit zorgt voor consistentie tussen Puppeteer-releases en vermijdt de mogelijkheid dat er een nieuwe Chrome-release arriveert met incompatibiliteiten die Puppeteer breken.

Voer nu npm install puppeteer uit in uw lokale werkmap. Hiermee wordt een package.json en package-lock.json gemaakt die u kunt gebruiken. Kopieer deze bestanden in uw Dockerfile naar de container en gebruik npm ci om Puppeteer te installeren.

# (bovenstaande sectie weggelaten) COPY package.json . KOPIE pakket-lock.json . RUN npm ci

De laatste stap is om het gebundelde Chromium-binaire bestand van Puppeteer goed uitvoerbaar te maken. Anders krijg je toestemmingsfouten wanneer Puppeteer Chrome probeert te starten.

# (bovenstaande sectie weggelaten) RUN chmod -R o+rwx node_modules/puppeteer/.local-chromium

Misschien wil je dit doen handmatig een specifieke Chrome-versie installeren in aangepaste omgevingen. Als u de PUPPETEER_SKIP_CHROMIUM_DOWNLOAD omgevingsvariabele instelt voordat u npm ci uitvoert, wordt de download van Puppeteer's eigen browser tijdens de installatie uitgeschakeld. Dit helpt je uiteindelijke afbeelding af te slanken.

Advertentie

Op dit punt zou je klaar moeten zijn om je afbeelding te bouwen:

docker build . -t puppeteer:latest

Dit is een vrij groot bouwproces dat enkele minuten kan duren bij een langzamere internetverbinding.

Puppeteer gebruiken in Docker

Puppeteer gebruiken in Docker

h2>

Er zijn enkele speciale overwegingen van toepassing op het starten van Chrome wanneer u Puppeteer gebruikt in een Dockerized-omgeving. Ondanks het installeren van alle afhankelijkheden, ziet de omgeving er nog steeds anders uit dan de meeste reguliere Chrome-installaties, dus er zijn extra startvlaggen vereist.

Hier is een minimaal voorbeeld van het gebruik van Puppeteer in uw container:

const poppenspeler = vereisen""poppenspeler");   const browser = wacht op puppeteer.launch({ zonder hoofd: waar, argumenten: [ “–disable-gpu”, “–disable-dev-shm-usage”, “–setuid-sandbox uitschakelen”, “–geen-sandbox”, ] });   const page = wacht browser.newPage(); wacht op page.goto("https://example.com"); const ss = wacht pagina.screenshot({pad: "/screenshot.png"});   wacht pagina af.close(); wacht browser.close();

Dit demonstreert een eenvoudig script dat een headless Chrome-instantie start, naar een URL navigeert en een screenshot van de pagina maakt. De browser wordt dan gesloten om verspilling van systeembronnen te voorkomen.

De belangrijke sectie is de lijst met argumenten die wordt doorgegeven aan Chromium als onderdeel van de launch()-aanroep:

    < li>gpu uitschakelen– De GPU is meestal niet beschikbaar in een Docker-container, tenzij je de host speciaal hebt geconfigureerd. Als u deze vlag instelt, geeft Chrome expliciet de instructie om GPU-gebaseerde weergave niet te gebruiken.
  • no-sandbox en disable-setuid-sandbox– Deze schakelen de sandboxing van Chrome uit, een stap die vereist is als de rootgebruiker wordt uitgevoerd (de standaard in een Docker-container). Door deze vlaggen te gebruiken, kan schadelijke webinhoud ontsnappen aan het browserproces en de host compromitteren. Het is van vitaal belang dat u ervoor zorgt dat uw Docker-containers sterk geïsoleerd zijn van uw host. Als u zich hier niet prettig bij voelt, moet u de werkende Chrome-sandboxing handmatig configureren, wat een ingewikkelder proces is.
  • disable-dev-shm-usage – Deze vlag is nodig om te voorkomen dat u problemen ondervindt met Docker's standaard lage gedeelde geheugenruimte van 64 MB. Chrome schrijft in plaats daarvan naar /tmp.

Advertentie

Voeg uw JavaScript toe aan uw container met een COPY-instructie. U zou moeten zien dat Puppeteer succesvol wordt uitgevoerd, op voorwaarde dat de juiste Chrome-vlaggen worden gebruikt.

Conclusion

Door Puppeteer in een Docker-container uit te voeren, kunt u webpagina's automatiseren als onderdeel van uw CI-pipelines en productie-infrastructuur. Het helpt je ook om je omgeving tijdens de ontwikkeling te isoleren, zodat je Chrome niet lokaal hoeft te installeren.

Je container moet de juiste afhankelijkheden hebben geïnstalleerd. U moet ook Chrome-startargumenten instellen zodat de browser correct werkt in uw Dockerized-omgeving. Daarna zou je de Puppeteer API moeten kunnen gebruiken zonder verdere speciale overwegingen.

Het is de moeite waard om aandacht te besteden aan het gebruik van Chrome-bronnen. Het starten van meerdere browsers in één containerinstantie kan de geheugenlimieten van Docker snel uitputten. Verhoog de limieten voor uw container of implementeer een systeem dat gelijktijdigheid van scripts beperkt of actieve browserinstanties hergebruikt.