Puppeteer no quiere arrancar - Error: Could not find Chromium (rev. 1056772)
Si, desafortunadamente esta semana tuve lidiando con este problema y les contaré porque pasó y como se puede arreglar.
La introducción
Tengo un contenedor basado en node:alpine
, el cual debe correr una aplicación de NestJS con el módulo de Puppeteer instalado, como ya han de saber, Puppeteer puede utilizar Chromium o Firefox para el renderizado de las páginas y algo que no sabía es que internamente y por omisión Puppeteer utiliza Chrome (que es lo mismo que Chromium pero no a la vez).
El problema
Pues bien, como es de esperar, en un ambiente de desarrollo esto funcionaba de maravilla, pero al montarlo en el contenedor el módulo retornaba el siguiente mensaje de error:
Error: Could not find Chromium (rev. 1056772). This can occur if either
1. you did not perform an installation before running the script (e.g. `npm install`) or
2. your cache path is incorrectly configured (which is: /root/.cache/puppeteer).
For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.
Inicialmente el mensaje no tiene mucho sentido porque localmente funciona, pero ojo, localmente el código siempre se ejecuta en un contexto donde Chromium es instalado como parte del sistema, algo que no es exactamente igual a tenerlo montado en un contenedor.
La solución
Leí un poco sobre la configuración, algunos hilos en la página del proyecto de github, pero después de varios intentos el problema persistía, intenté algunas cosas como:
- creando el archivo de configuración de puppeteer (
.puppeteerrc.cjs
) y poniéndolo en la raíz del proyecto y en la carpeta /src.
Esto es necesario porque al momento de instalarse puppeteer como dependencia, se descarga Chrome, pero es necesario especificar dónde se debe de descargar.
Funcionó la descarga, pero como esperaba y viendo el código de puppeteer vi que se ejecuta una comando para descargar Chrome, mismo que en las conversaciones sugerían que se hiciera como parte del postInstall, especificado en el archivo package.json.
- También cree manualmente las carpetas
.cache
ypuppeteer
, pero no hubo ningún cambio.
Más sencillo de lo que imaginaba, finalmente encontré que esto es un bug recientemente introducido en puppeteer y pasa porque la versión instalada no es la misma que se pretende utilizar, digamos que se descarga Chrome (porque es la opción por omisión), pero normalmente se usa Chromium porque estamos usando Linux y queremos el proyecto funcionando para la consola.
Entonces al cabo de varios intentos, conseguí hacer lo siguiente:
# Instalar chromium en el contendor
RUN apk --no-cache add chromium
# Esto es necesario ponerlo antes del yarn/npm install para que puppeteer no descargue chrome
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true"
# Se le especifica a puppeteer que la version a utilizar, sera la versión recientemente instalada
ENV CHROMIUM_PATH="/usr/bin/chromium-browser"
ENV PUPPETEER_EXECUTABLE_PATH="${CHROMIUM_PATH}"
Es importante mencionar en este punto, que el archivo .puppeteerrc.cjs
quedó en la raíz del proyecto y las carpetas .cache y puppeteer no fueron necesarias despues de todo.
Algo muy extraño es que en un Linux no funcionó, pero el mismo código fue probado en iOS M1 y funcionó sin problemas, incluso hasta tuve la intención de subir esa imagen al repositorio, pero no, lo mejor fue encontrar la solución (que satisfacción).
Y si lo que intentas es poner en marcha puppeteer localmente, pero tienes este error, simplemente ejecuta en tu terminal el siguiente comando:
node ./node_modules/puppeteer/install.js
Y recuerda tener configurado el archivo .puppeteerrc.cjs
en la raiz de tu proyecto.
Happy coding! :D
Photo by frank mckenna on Unsplash