Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

docker alpine with node js and chromium headless - puppeter - failed to launch chrome

I'm trying to run a custom node command from within an Alpine linux docker container.

Installed packages:

alpine-baselayout
alpine-keys
libressl2.4-libcrypto
libressl2.4-libssl
apk-tools
scanelf
libc-utils
glibc
libgcc
glibc-bin
libbz2
expat
libffi
gdbm
xz-libs
ncurses-terminfo-base
ncurses-terminfo
ncurses-libs
readline
sqlite-libs
musl
zlib
libpng
freetype
pkgconf
zlib-dev
libpng-dev
freetype-dev
libstdc++
binutils-libs
binutils
gmp
isl
libgomp
libatomic
mpfr3
mpc1
gcc
musl-dev
libc-dev
g++
ca-certificates
libssh2
libcurl
pcre
git
libjpeg-turbo
libjpeg-turbo-dev
tiff
tiff-dev
lcms2
lcms2-dev
musl-utils
libffi-dev
libressl
libressl2.4-libtls
libressl-dev
make
db
libsasl
libldap
libpq
postgresql-libs
postgresql-dev
python2
py-setuptools
python3
python3-dev
libxau
libbsd
libxdmcp
libxcb
libx11
gifsicle
pngquant
optipng
libjpeg-turbo-utils
busybox
udev-init-scripts
eudev-libs
libuuid
libblkid
kmod
eudev
fontconfig
libfontenc
mkfontscale
mkfontdir
ttf-opensans
libogg
flac
libxcomposite
libxfixes
libxrender
libxcursor
libxdamage
libxext
libxi
libxrandr
libxscrnsaver
libxtst
alsa-lib
libintl
libmount
glib
atk
pixman
cairo
dbus-libs
avahi-libs
nettle
libtasn1
p11-kit
libunistring
gnutls
cups-libs
libxml2
shared-mime-info
hicolor-icon-theme
gdk-pixbuf
gtk-update-icon-cache
libxinerama
at-spi2-core
at-spi2-atk
cairo-gobject
libepoxy
graphite2
harfbuzz
libxft
pango
gtk+3.0
minizip
nspr
nss
snappy
libwebp
libgpg-error
libgcrypt
libxslt
chromium
.build-deps
libwebp-dev
c-ares
libcrypto1.0
http-parser
libssl1.0
libuv
nodejs
nodejs-npm
libidl
orbit2
dbus-glib
polkit
gconf

node packages (npm list --depth=0):

[email protected] /var/www/my_proj/idf/static/js
└── [email protected]

but I'm experiencing some errors:

/var/www/my_proj/idf/static/js # node render.js uid=uid-param url=https://www.targethost.example token=tk-param out=/tmp/test.pdf

(node:167) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Failed to launch chrome!
/var/www/my_proj/idf/static/js/node_modules/puppeteer/.local-chromium/linux-508693/chrome-linux/chrome: /usr/lib/libasound.so.2: no version information available (required by /var/www/my_proj/idf/static/js/node_modules/puppeteer/.local-chromium/linux-508693/chrome-linux/chrome)


TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md

(node:167) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

it seems that is not able to instantiate chromium. I also tried to modify teh render.js script while it creates an instance of the browser to this:

const browser = await puppeteer.launch({
        args: ['--no-sandbox'],
        headless: false
    });

but I got the same result. Any help on this?

like image 677
Luke Avatar asked Jan 12 '18 17:01

Luke


People also ask

Can Puppeteer use Chrome instead of Chromium?

(However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the executablePath option to puppeteer. launch .

Does Puppeteer work with Chrome?

Puppeteer is a Node library which provides a high-level API to control headless Chrome or Chromium over the DevTools Protocol. It can also be configured to use full (non-headless) Chrome or Chromium.

Can Puppeteer run in Docker?

Puppeteer is a Node. js library which provides a high-level API to control Chromium (or Firefox) browsers over the DevTools Protocol. This guide helps to use Puppeteer inside a Docker container using the Node. js image.

Does Puppeteer install Chromium?

When you install Puppeteer, it automatically downloads a recent version of Chromium (~170MB macOS, ~282MB Linux, ~280MB Windows) that is guaranteed to work with Puppeteer. For a version of Puppeteer without installation, see puppeteer-core .


2 Answers

This worked for me

Use Puppeteer v0.13.0. As of writing this comment, the latest version of Puppeteer is not compatible with chromium in Alpine linux.

PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true" will skip downloading the default version of Chromium when installing Puppeteer.

Dockerfile:

FROM node:11-alpine

ENV CHROME_BIN="/usr/bin/chromium-browser"\
    PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true"

RUN set -x \
  && apk update \
  && apk upgrade \
  # replacing default repositories with edge ones
  && echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" > /etc/apk/repositories \
  && echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \
  && echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories \
  \
  # Add the packages
  && apk add --no-cache dumb-init curl make gcc g++ python linux-headers binutils-gold gnupg libstdc++ nss chromium \
  \
  && npm install [email protected] \
  \
  # Do some cleanup
  && apk del --no-cache make gcc g++ python binutils-gold gnupg libstdc++ \
  && rm -rf /usr/include \
  && rm -rf /var/cache/apk/* /root/.node-gyp /usr/share/man /tmp/* \
  && echo

ENTRYPOINT ["/usr/bin/dumb-init"]

CMD node

NodeJs:

You need to tell Puppeteer to use the installed Chromium version using the following config - executablePath: '/usr/bin/chromium-browser'

const puppeteer = require('puppeteer');

puppeteer
  .launch({
    executablePath: '/usr/bin/chromium-browser',
    args: ['--no-sandbox', '--disable-dev-shm-usage'],
  })
  .then(async (browser) => {
    // your code
  });
like image 189
Sohail Avatar answered Sep 18 '22 13:09

Sohail


If you want to get puppeteer to work on alpine, try using an older version of puppeteer that works with an older version of Chrome. The newest version of Chrome supported on Alpine is 63, which was the version of Chrome used during the development of puppeteer version 0.11.0.

npm install --save [email protected]

This version of Chrome can only be found on Alpine edge. You can install it in older versions of Alpine by running the following.

ENV CHROME_BIN=/usr/bin/chromium-browser
RUN echo @edge http://nl.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories && \
    echo @edge http://nl.alpinelinux.org/alpine/edge/main >> /etc/apk/repositories && \
    apk add --no-cache \
      chromium@edge \
      nss@edge

Make sure you start puppeteer the with the following configuration

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({
  executablePath: process.env.CHROME_BIN || null,
  args: ['--no-sandbox', '--headless', '--disable-gpu']
});
like image 30
Clay Risser Avatar answered Sep 19 '22 13:09

Clay Risser