Q:

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):
node-pdf-renderer@0.0.1 /var/www/my_proj/idf/static/js
└── puppeteer@0.12.0

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?

A:

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 puppeteer@0.11.0

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']
});

A:

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 puppeteer@0.13.0 \
  \
  # 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
  });

