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.
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"]
Most helpful comment
I've managed to pass the parameter thru puppeteer via Client options: