Come eseguire Burattinaio e Chrome senza testa in un contenitore Docker

0
144

Puppeteer è una libreria Node.js che ti consente di interagire con il web di Chrome browser. Le versioni recenti includono anche il supporto per Firefox.

Puppeteer è comunemente usato per automatizzare i test, archiviare i dati delle pagine web e generare screenshot di contenuti web live. Ti consente di controllare Chrome tramite un'API chiara, dandoti la possibilità di navigare tra le pagine, fare clic sui controlli del modulo ed emettere comandi del browser.

Far funzionare Puppeteer in un container Docker può essere complesso in quanto molte dipendenze sono necessario per eseguire Chrome headless. Ecco come installare tutto in modo da poter utilizzare Puppeteer in un cluster Kubernetes, in un container isolato sulla tua macchina di sviluppo o come parte di una pipeline CI.

I requisiti di base

Stiamo usando un'immagine basata su Debian per gli scopi di questo articolo. Se stai utilizzando una base diversa, dovrai adattare di conseguenza i comandi del gestore pacchetti visualizzati. L'immagine ufficiale di Node.js è un punto di partenza adatto che significa che non è necessario installare manualmente Node.

Puppeteer è distribuito tramite npm, il gestore di pacchetti Node.js. Raggruppa l'ultima build di Chromium nel suo pacchetto, quindi teoricamente un burattinaio di installazione npm ti farebbe correre. In pratica, un ambiente Docker pulito non avrà le dipendenze necessarie per eseguire Chrome.

Pubblicità

Poiché di solito è un programma GUI pesante, Chrome dipende dalle librerie di font, grafica, configurazione e gestione delle finestre. Questi devono essere tutti installati all'interno del tuo Dockerfile.

Al momento della scrittura, l'elenco delle dipendenze corrente è simile a questo:

FROM node:latest WORKDIR /puppeteer RUN apt-get install -yfonts-liberationgconf-servicelibappindicator1libasound2libatk1.0-0libcairo2libcups2libfontconfig1libgbm-devlibgdk-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 libxdamcursorage1 libxdamcursorage libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 xdg-utils

Le dipendenze vengono installate manualmente per facilitare l'uso del binario Chromium fornito in bundle con Puppeteer. Ciò garantisce la coerenza tra le versioni di Puppeteer ed evita la possibilità che una nuova versione di Chrome arrivi con incompatibilità che interrompono Puppeteer.

Ora esegui npm install puppeteer nella tua directory di lavoro locale. Questo creerà un package.json e un package-lock.json da usare. Nel tuo Dockerfile, copia questi file nel contenitore e usa npm ci per installare Puppeteer.

# (sezione sopra omessa) COPY package.json . COPIA pacchetto-lock.json . ESEGUI npm ci

Il passaggio finale consiste nel rendere correttamente eseguibile il binario in bundle di Chromium di Puppeteer. Altrimenti, ti imbatterai in errori di autorizzazione ogni volta che Puppeteer tenta di avviare Chrome.

# (sezione sopra omessa) ESEGUI chmod -R o+rwx node_modules/puppeteer/.local-chromium

Potresti voler installa manualmente una specifica versione di Chrome in ambienti personalizzati. L'impostazione della variabile di ambiente PUPPETEER_SKIP_CHROMIUM_DOWNLOAD prima di eseguire npm ci disabiliterà il download del browser di Puppeteer durante l'installazione. Questo aiuta a snellire la tua immagine finale.

Pubblicità

A questo punto dovresti essere pronto per creare la tua immagine:

docker build . -t puppeteer:latest

Questo è un processo di compilazione abbastanza lungo che potrebbe richiedere diversi minuti con una connessione Internet più lenta.

Uso di Puppeteer in Docker

h2>

Alcune considerazioni speciali si applicano all'avvio di Chrome quando utilizzi Puppeteer in un ambiente Dockerized. Nonostante l'installazione di tutte le dipendenze, l'ambiente sembra ancora diverso dalla maggior parte delle normali installazioni di Chrome, quindi sono necessari flag di avvio aggiuntivi.

Ecco un esempio minimo di utilizzo di Puppeteer all'interno del tuo contenitore:

const burattinaio = require("burattinaio");   const browser = attendi puppeteer.launch({ senza testa: vero, argomenti: [ "–disable-gpu", "–disable-dev-shm-usage", "–disable-setuid-sandbox", "–no-sandbox", ] });   const page = wait browser.newPage(); attendi page.goto("https://example.com"); const ss = wait page.screenshot({percorso: "/screenshot.png"});   attendi pagina.close(); attendere browser.close();

Questo dimostra un semplice script che avvia un'istanza di Chrome headless, accede a un URL e acquisisce uno screenshot della pagina. Il browser viene quindi chiuso per evitare di sprecare risorse di sistema.

La sezione importante è l'elenco degli argomenti che è passato a Chromium come parte della chiamata launch():

    < li>disabilita-gpu– La GPU di solito non è disponibile all'interno di un contenitore Docker, a meno che tu non abbia configurato in modo speciale l'host. L'impostazione di questo flag indica esplicitamente a Chrome di non provare a utilizzare il rendering basato su GPU.
  • no-sandbox e disable-setuid-sandbox– Questi disabilitano il sandboxing di Chrome, un passaggio necessario durante l'esecuzione come utente root (l'impostazione predefinita in un container Docker). L'utilizzo di questi flag potrebbe consentire ai contenuti Web dannosi di sfuggire al processo del browser e compromettere l'host. È fondamentale che i container Docker siano fortemente isolati dall'host. Se non ti senti a tuo agio, dovrai configurare manualmente il sandboxing di Chrome funzionante, che è un processo più complesso.
  • disable-dev-shm-usage – Questo flag è necessario per evitare problemi con lo spazio di memoria condiviso insufficiente predefinito di Docker di 64 MB. Chrome scriverà invece in /tmp.

Pubblicità

Aggiungi il tuo JavaScript al tuo contenitore con un'istruzione COPY. Dovresti trovare che Puppeteer viene eseguito correttamente, a condizione che vengano utilizzati i flag di Chrome appropriati.

Conclusione

L'esecuzione di Puppeteer in un contenitore Docker ti consente di automatizzare le pagine web come parte delle tue pipeline CI e infrastrutture di produzione. Ti aiuta anche a isolare il tuo ambiente durante lo sviluppo, quindi non è necessario installare Chrome localmente.

Il tuo contenitore deve avere le dipendenze corrette installate. Devi anche impostare gli argomenti di avvio di Chrome in modo che il browser funzioni correttamente nel tuo ambiente Dockerized. Successivamente, dovresti essere in grado di utilizzare l'API Puppeteer senza ulteriori considerazioni speciali.

Vale la pena prestare attenzione all'utilizzo delle risorse di Chrome. L'avvio di più browser in una singola istanza di container potrebbe esaurire rapidamente i limiti di memoria di Docker. Aumenta i limiti sul tuo contenitore o implementa un sistema che limiti la concorrenza degli script o riutilizzi le istanze del browser in esecuzione.