Hur man kör Puppeteer och Headless Chrome i en Docker -behållare

0
175

Puppeteer är ett Node.js -bibliotek som låter dig interagera med Chrome -webben webbläsare. De senaste utgåvorna inkluderar också Firefox -stöd.

Puppeteer används ofta för att automatisera tester, arkivera webbsidodata och generera skärmdumpar av levande webbinnehåll. Det låter dig styra Chrome via ett tydligt API, vilket ger dig möjlighet att navigera till sidor, klicka på formulärkontroller och utfärda webbläsarkommandon.

Att få Puppeteer att köra i en Docker -behållare kan vara komplext eftersom många beroenden är behövs för att köra headless Chrome. Så här installerar du allt så att du kan använda Puppeteer i ett Kubernetes-kluster, i en isolerad behållare på din dev-maskin eller som en del av en CI-pipeline.

Grundkraven

Vi använder en Debian-baserad bild för denna artikel. Om du använder en annan bas måste du anpassa kommandona för pakethanteraren i enlighet därmed. Den officiella Node.js -bilden är en lämplig utgångspunkt som innebär att du inte behöver installera Node manuellt.

Puppeteer distribueras via npm, pakethanteraren Node.js. Det buntar ihop den senaste versionen av krom i sitt paket, så teoretiskt sett skulle en npm -installeringsdockare få dig att springa. I praktiken saknar en ren Docker -miljö de beroenden du behöver för att köra Chrome.

Annonsering

Eftersom det vanligtvis är ett tungt GUI -program beror Chrome på teckensnitt, grafik, konfiguration och fönsterhanteringsbibliotek. Allt detta måste installeras i din Dockerfile.

I skrivande stund ser den aktuella beroendelistan ut så här:

FRÅN nod: senaste WORKDIR /marionettkörning KÖP apt-get install -y fonts-liberation gconf-service libappindicator1 libasound2 libatk1.0-0 libcairo2 libcups2 libfontconfig1 libgbm-dev libgdk-pixbuf2.0-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 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 xdg-utils

Beroenden installeras manuellt för att underlätta användningen av Chromium -binären som medföljer Puppeteer. Detta säkerställer överensstämmelse mellan Puppeteer -utgåvor och undviker möjligheterna att en ny Chrome -version kommer med oförenligheter som bryter Puppeteer.

Kör nu npm install puppeteer i din lokala arbetskatalog. Detta skapar ett package.json och package-lock.json som du kan använda. I din Dockerfile, kopiera dessa filer till behållaren och använd npm ci för att installera Puppeteer.

# (ovanstående avsnitt utelämnat) COPY package.json. KOPIERA paketlås.json. KÖR npm ci

Det sista steget är att göra Puppeteer's medföljande Chromium -binär korrekt körbar. Annars kommer du att stöta på behörighetsfel när Puppeteer försöker starta Chrome.

# (ovanstående avsnitt utelämnat) RUN chmod -R o+rwx node_modules/puppeteer/.local -chromium

Du kanske vill manuellt installera en specifik Chrome -version i anpassade miljöer. Om du ställer in miljövariabeln PUPPETEER_SKIP_CHROMIUM_DOWNLOAD innan du kör npm ci inaktiveras Puppeteer's egen webbläsarnedladdning under installationen. Detta hjälper till att förminska din slutliga bild.

Annonsering

Vid denna tidpunkt bör du vara redo att bygga din bild:

docker build. -t puppeteer: senaste

Det här är en ganska stor byggprocess som kan ta flera minuter på en långsammare internetuppkoppling.

Använda Puppeteer i Docker

Vissa särskilda överväganden gäller för att starta Chrome när du använder Puppeteer i en dockad miljö. Trots att alla beroenden är installerade ser miljön fortfarande annorlunda ut än de flesta vanliga Chrome -installationer, så ytterligare lanseringsflaggor krävs.

Här är ett minimalt exempel på att använda Puppeteer inuti behållaren:

const puppeteer = fordrar ( & quot; marionettspelare & quot; &#41 ;; & nbsp; const webbläsare = invänta marionettspelare. lansera ( { huvudlös: sant, args: [ & quot;-disable-gpu & quot ;, & quot;-disable-dev-shm-usage & quot ;, & quot;-disable-setuid-sandbox & quot ;, & quot;-no-sandbox & quot ;, ] } &#41 ;; & nbsp; const page = invänt webbläsare. ny sida ( &#41 ;; avvakta sidan. gå till ( & quot; https: //example.com" &#41 ;; const ss = await page.screenshot ( { path: & quot; /screenshot.png" } &#41 ;; & nbsp; invänta sida. stäng ( &#41 ;; vänta på webbläsaren. stäng ( &#41 ;;

Detta visar ett enkelt skript som startar en huvudlös Chrome -instans, navigerar till en URL och tar en skärmdump av sidan. Webbläsaren stängs sedan för att undvika slöseri med systemresurser.

Det viktiga avsnittet är argumentlistan som skickades till Chromium som en del av lanseringen ():

    < li> inaktivera-gpu – GPU: n är vanligtvis inte tillgänglig i en Docker -behållare, såvida du inte har konfigurerat värden speciellt. Om du anger denna flagga instrueras Chrome uttryckligen att inte försöka använda GPU-baserad återgivning.
  • ingen sandlåda och inaktivera-setuid-sandlåda – Dessa inaktiverar Chrome sandboxning, ett steg som krävs när du kör som rotanvändare (standard i en Docker -behållare). Genom att använda dessa flaggor kan skadligt webbinnehåll undkomma webbläsarprocessen och äventyra värden. Det är viktigt att du ser till att dina Docker -behållare är starkt isolerade från din värd. Om du känner dig obekväm med detta måste du manuellt konfigurera fungerande Chrome-sandlåda, vilket är en mer involverad process.
  • disable-dev-shm-usage – Den här flaggan är nödvändig för att undvika att stöta på problem med Dockers standarddelade låga delade minnesutrymme på 64 MB. Chrome skriver istället till/tmp.

Annonsering

Lägg till din JavaScript i din behållare med en KOPIERING instruktion. Du bör hitta Puppeteer -körningar framgångsrikt, förutsatt att korrekta Chrome -flaggor används.

Slutsats

Genom att köra Puppeteer i en Docker -behållare kan du automatisera webbsidor som en del av dina CI -pipelines och produktionsinfrastruktur. Det hjälper dig också att isolera din miljö under utvecklingen, så du behöver inte installera Chrome lokalt.

Din behållare måste ha rätt beroenden installerade. Du måste också ange Chrome -startargument så att webbläsaren fungerar korrekt i din Dockerized -miljö. Efteråt bör du kunna använda Puppeteer API utan ytterligare särskilda överväganden.

Det är värt att uppmärksamma Chrome: s resursanvändning. Att starta flera webbläsare i en enda behållarinstans kan snabbt ta ut Docker -minnesgränser. Antingen höjer du gränserna för din behållare eller implementerar ett system som begränsar samtidigheten av skript eller återanvänder körning av webbläsarinstanser.