Cursos

[Noticias][grids]

Como executar o Puppeteer e o Headless Chrome em um contêiner Docker


 Puppeteer é uma biblioteca Node. js que permite interagir com o navegador Chrome. Lançamentos recentes também incluem suporte para Firefox.

O Puppeteer é comumente usado para automatizar testes, arquivar dados de páginas da web e gerar capturas de tela de conteúdo da web ao vivo. Ele permite que você controle o Chrome por meio de uma API clara, oferecendo a capacidade de navegar pelas páginas, clicar nos controles do formulário e emitir comandos do navegador.

Fazer com que o Puppeteer seja executado em um contêiner do Docker pode ser complexo, pois muitas dependências são necessárias para executar o Chrome headless. Veja como instalar tudo para que você possa usar o Puppeteer em um cluster do Kubernetes, em um contêiner isolado em sua máquina de desenvolvimento ou como parte de um pipeline de CI.

Os requisitos básicos

Estamos usando uma imagem baseada em Debian para os propósitos deste artigo. Se você estiver usando uma base diferente, precisará adaptar os comandos do gerenciador de pacotes exibidos de acordo. A imagem oficial do Node. js é um ponto de partida adequado, o que significa que você não precisa instalar o Node manualmente.

Puppeteer é distribuído via npm, o gerenciador de pacotes Node. js. Ele reúne a versão mais recente do Chromium dentro de seu pacote, então, teoricamente, um titereiro de instalação do npm faria você correr. Na prática, um ambiente limpo do Docker não terá as dependências de que você precisa para executar o Chrome.

Publicidade

Como normalmente é um programa de GUI pesado, o Chrome depende de fontes, gráficos, configuração e bibliotecas de gerenciamento de janela. Todos eles precisam ser instalados em seu Dockerfile.

No momento em que este artigo foi escrito, a lista de dependências atual se parecia com esta:

 DO nó: mais recente WORKDIR / puppeteer RUN apt-get install -y \ fonts-liberation \ gconf-service \ libappindicator1 \ libasound2 \ libatk1.0-0 \ libcairo2 \ libcups2 \ libfontig1 \ 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 

As dependências estão sendo instaladas manualmente para facilitar o uso do binário do Chromium que está empacotado com o Puppeteer. Isso garante a consistência entre os lançamentos do Puppeteer e evita a possibilidade de um novo lançamento do Chrome chegar com incompatibilidades que quebram o Puppeteer.

Agora execute npm install puppeteer em seu diretório de trabalho local. Isso criará um package. json e um package-lock. json para você usar. Em seu Dockerfile, copie esses arquivos para o contêiner e use o npm ci para instalar o Puppeteer.

 # (seção acima omitida) COPY package. json. COPY package-lock. json. RUN npm ci 

A etapa final é tornar o binário do Chromium empacotado do Puppeteer devidamente executável. Caso contrário, você encontrará erros de permissão sempre que o Puppeteer tentar iniciar o Chrome.

 # (seção acima omitida) RUN chmod -R o + rwx node_modules / puppeteer / . local-chromium 

Você pode querer instalar manualmente uma versão específica do Chrome em ambientes personalizados. Definir a variável de ambiente PUPPETEER_SKIP_CHROMIUM_DOWNLOAD antes de executar o npm ci desabilitará o download do próprio navegador da Puppeteer durante a instalação. Isso ajuda a reduzir a imagem final.

Publicidade

Neste ponto, você deve estar pronto para construir sua imagem:

 compilação do docker. -t titereiro: mais recente 

Este é um processo de compilação bastante grande que pode levar vários minutos em uma conexão de Internet mais lenta.

Usando o Puppeteer no Docker

Algumas considerações especiais se aplicam ao lançamento do Chrome ao usar o Puppeteer em um ambiente Dockerizado. Apesar de instalar todas as dependências, o ambiente ainda parece diferente da maioria das instalações regulares do Chrome, então sinalizadores de inicialização adicionais são necessários.

Aqui está um exemplo mínimo de como usar o Puppeteer dentro do seu contêiner:

const marionetista = requer & # 40; " marionetista " & # 41 ;;   navegador const = espera puppeteer. launch & # 40; & # 123; headless: true, args: & # 91; " - disable-gpu ", " - disable-dev-shm-usage ", " - disable-setuid-sandbox ", " - no-sandbox & quot ;, & # 93; & # 125; & # 41 ;;   const page = await browser. newPage & # 40; & # 41 ;; await page. goto & # 40; " https: //example. com" & # 41 ;; const ss = await page. screenshot & # 40; & # 123; caminho: " /screenshot. png" & # 125; & # 41 ;;   aguarde page. close & # 40; & # 41 ;; aguarde browser. close & # 40; & # 41 ;;

Isso demonstra um script simples que inicia uma instância sem cabeça do Chrome, navega para um URL e captura uma captura de tela da página. O navegador é então fechado para evitar o desperdício de recursos do sistema.

A seção importante é a lista de argumentos que &’ é passada para o Chromium como parte da chamada launch ():

  •  disable-gpu – A GPU geralmente não está disponível dentro de um contêiner do Docker, a menos que você tenha configurado especialmente o host. Definir esta sinalização instrui explicitamente o Chrome a não tentar usar a renderização baseada em GPU.
  •  no-sandbox e disable-setuid-sandbox – Isso desativa o sandbox do Chrome, uma etapa necessária durante a execução como usuário root (o padrão em um contêiner do Docker). O uso desses sinalizadores pode permitir que conteúdo da web malicioso escape do processo do navegador e comprometa o host. É vital que você verifique se os contêineres do Docker estão totalmente isolados do seu host. Se você não se sentir confortável com isso, será necessário configurar manualmente o sandbox do Chrome em funcionamento, que é um processo mais complexo.
  •  disable-dev-shm-usage – Este sinalizador é necessário para evitar problemas com o espaço de memória compartilhada baixo padrão do Docker de 64 MB. Em vez disso, o Chrome gravará em / tmp.

Publicidade

Adicione seu JavaScript ao seu contêiner com uma instrução COPY. Você deve descobrir que o Puppeteer é executado com êxito, desde que os sinalizadores apropriados do Chrome sejam usados.

Conclusão

Executar o Puppeteer em um contêiner do Docker permite automatizar páginas da web como parte de seus pipelines de CI e infraestrutura de produção. Também ajuda a isolar seu ambiente durante o desenvolvimento, para que você não precise instalar o Chrome localmente.

Seu contêiner precisa ter as dependências corretas instaladas. Você também deve definir os argumentos de inicialização do Chrome para que o navegador opere corretamente em seu ambiente Dockerized. Depois disso, você deve ser capaz de usar a API Puppeteer sem outras considerações especiais.

Vale a pena prestar atenção ao uso de recursos do Chrome. Iniciar vários navegadores em uma única instância de contêiner pode esgotar rapidamente os limites de memória do Docker. Aumente os limites do seu contêiner ou implemente um sistema que restrinja a simultaneidade do script ou reutilize as instâncias do navegador em execução.