Whatsapp-web.js: option to use chrome with --no-sandbox to use on docker containers

Created on 9 Apr 2020  路  5Comments  路  Source: pedroslopez/whatsapp-web.js

There are a lot of problems to run this app on containers due to chrome limitations, as stated here (https://stackoverflow.com/questions/59087200/google-chrome-failed-to-move-to-new-namespace). Adding the parameter --no-sandbox (not recommended outside of a container) should avoid further problems.
Maybe adding a parameter somewhere where we can configure it, would be awesome.

Most helpful comment

I've managed to pass the parameter thru puppeteer via Client options:

const puppeteerOptions = {
    puppeteer: {
        args: ['--no-sandbox', '--disable-setuid-sandbox']
    }
};


const { Client } = require('whatsapp-web.js');
const client = new Client(puppeteerOptions);

All 5 comments

It's not necessary this param to run inside an container, probably you are doing something wrong, i run that into containers very well...

would you mind to tell me how you create your Dockerfile in order to get it running?

So far I have the following:

FROM node

# Install Chromium.
RUN \
  wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
  echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list && \
  apt-get update && \
  apt-get install -y google-chrome-stable && \
  rm -rf /var/lib/apt/lists/*s

RUN npm i whatsapp-web.js && npm i qrcode-terminal

RUN mkdir /app
COPY test.js /app/test.js

# Run everything after as non-privileged user.
RUN useradd -ms /bin/bash wppuser
USER wppuser

CMD ["node","/app/test.js"]

I've managed to pass the parameter thru puppeteer via Client options:

const puppeteerOptions = {
    puppeteer: {
        args: ['--no-sandbox', '--disable-setuid-sandbox']
    }
};


const { Client } = require('whatsapp-web.js');
const client = new Client(puppeteerOptions);

so, I've made some tests......and I found this:

if you do not want to run chromium with "--no-sandbox" flag, then you need to run docker with SYS_ADMIN capabilities:

docker run --cap-add=SYS_ADMIN wppclient

otherwise just pass the parameter thru puppeteer ans run normally:

docker run wppclient

I'm running docker toolbox from a windows machine, not sure if it is related.

since this is a non-issue with the whatsapp-web.js whatsoever , I am closing the issue as I figured out 2 options to run it on a container.

I've managed to pass the parameter thru puppeteer via Client options:

const puppeteerOptions = {
    puppeteer: {
        args: ['--no-sandbox', '--disable-setuid-sandbox']
    }
};


const { Client } = require('whatsapp-web.js');
const client = new Client(puppeteerOptions);

Thanks @felipemm ! I think you can reduce the image size by using the procedure you did above and using a Dockerfile configuration like below:

FROM node:12-slim

# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)
# Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer
# installs, work.
RUN apt-get update \
    && apt-get install -y wget gnupg \
    && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
    && apt-get update \
    && apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
      --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

# If running Docker >= 1.13.0 use docker run's --init arg to reap zombie processes, otherwise
# uncomment the following lines to have `dumb-init` as PID 1
# ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_x86_64 /usr/local/bin/dumb-init
# RUN chmod +x /usr/local/bin/dumb-init
# ENTRYPOINT ["dumb-init", "--"]

# Uncomment to skip the chromium download when installing puppeteer. If you do,
# you'll need to launch puppeteer with:
#     browser.launch({executablePath: 'google-chrome-stable'})
# ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true

# Install puppeteer so it's available in the container.
RUN npm i puppeteer \
    # Add user so we don't need --no-sandbox.
    # same layer as npm install to keep re-chowned files from using up several hundred MBs more space
    && groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser \
    && mkdir -p /home/pptruser/Downloads \
    && chown -R pptruser:pptruser /home/pptruser \
    && chown -R pptruser:pptruser /node_modules

# Run everything after as non-privileged user.
USER pptruser

COPY ./package.json ./
COPY ./package-lock.json ./
COPY ./src ./src

RUN npm install

CMD ["node", "./src/index.js"]
Was this page helpful?
0 / 5 - 0 ratings

Related issues

ngekoding picture ngekoding  路  5Comments

therevolt picture therevolt  路  4Comments

andersondeoliveiramachado picture andersondeoliveiramachado  路  7Comments

riagie picture riagie  路  6Comments

nicolascav picture nicolascav  路  6Comments