Tło

Zbudowałem aplikację, która używa lalek na moim localhost. Teraz, gdy próbuję wdrożyć go w środowisku Debiana, skrypt, który prowadzi laleketer czas. Po badaniu zdałem sobie sprawę, że jest to powszechny problem. Większość środowisk Debiana brakuje zależności potrzebnych do prowadzenia chromu.

Problem

Znalazłem zalecane sposoby uruchomienia aplikacji za pomocą dokera tutaj.

Mogę uruchomić aplikację za pomocą Dockera, ale po dodaniu danych poszczególnych danych chrom do mojego pliku dokującego otrzymuję kilka błędów.

Nie udało się przejść do nowej przestrzeni nazw: Obsługiwane wspornik przestrzeni nazw PID, obsługiwane, ale nie powiodło się: errno = operacja niedozwolona

Sugeruje się, aby uruchomić aplikację jako użytkownik wykonany w pliku Docker. Ale kiedy dodam ten użytkownik, użytkownik otrzymuje błąd wspomniany powyżej.

Wtedy, gdy próbuję uruchomić aplikację jako root, otrzymuję nowy błąd,

Bieganie jako root bez --no-piaskownicy nie jest obsługiwany.

Chociaż nie jest zalecany, chcę uzyskać aplikację, która działa nawet z --no-sandbox, aby sprawdzić, czy działa.

Przykład

Uruchamiam taką aplikację,

docker run -p 3000:3000 user/app-name

plik dokera

FROM ubuntu:16.04

# Application parameters and variables
ENV NODE_ENV=production
ENV PORT=3000
ENV Root_Dir /
ENV application_directory /usr/src/app
ENV font_directory /usr/share/fonts/noto

# Configuration for Chrome
ENV CONNECTION_TIMEOUT=60000
ENV CHROME_PATH=/usr/bin/google-chrome

RUN mkdir -p $application_directory
RUN mkdir -p $font_directory

# Dependencies needed for packages downstream
RUN apt-get update && apt-get install -y \
  apt-utils \
  unzip \
  fontconfig \
  locales \
  gconf-service \
  libasound2 \
  libatk1.0-0 \
  libc6 \
  libcairo2 \
  libcups2 \
  libdbus-1-3 \
  libexpat1 \
  libfontconfig1 \
  libgcc1 \
  libgconf-2-4 \
  libgdk-pixbuf2.0-0 \
  libglib2.0-0 \
  libgtk-3-0 \
  libnspr4 \
  libpango-1.0-0 \
  libpangocairo-1.0-0 \
  libstdc++6 \
  libx11-6 \
  libx11-xcb1 \
  libxcb1 \
  libxcomposite1 \
  libxcursor1 \
  libxdamage1 \
  libxext6 \
  libxfixes3 \
  libxi6 \
  libxrandr2 \
  libxrender1 \
  libxss1 \
  libxtst6 \
  ca-certificates \
  fonts-liberation \
  libappindicator1 \
  libnss3 \
  lsb-release \
  xdg-utils \
  wget

# It's a good idea to use dumb-init to help prevent zombie chrome processes.
ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64 /usr/local/bin/dumb-init
RUN chmod +x /usr/local/bin/dumb-init

# Install Node.js
RUN apt-get install --yes curl &&\
  curl --silent --location https://deb.nodesource.com/setup_8.x | bash - &&\
  apt-get install --yes nodejs &&\
  apt-get install --yes build-essential

# Install emoji's
RUN cd $font_directory &&\
  wget https://github.com/emojione/emojione-assets/releases/download/3.1.2/emojione-android.ttf &&\
  wget https://github.com/googlei18n/noto-cjk/blob/master/NotoSansCJKsc-Medium.otf?raw=true && \
  fc-cache -f -v

RUN apt-get update && apt-get install -y wget --no-install-recommends \
    && 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-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst ttf-freefont \
        --no-install-recommends \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get purge --auto-remove -y curl \
    && rm -rf /src/*.deb

# Cleanup
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Install puppeteer so it's available in the container.
RUN npm i puppeteer

# Add user so we don't need --no-sandbox.
RUN 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 cd $application_directory

WORKDIR $application_directory

# Install app dependencies
COPY package.json .

# Bundle app source
COPY . .

# Build
RUN npm install

USER pptruser

# Expose the web-socket and HTTP ports
EXPOSE 3000
ENTRYPOINT ["dumb-init", "--"]
CMD ["google-chrome-unstable", "npm", "start"]

Pytanie

Jak uruchomić doker i przekazać,

--no-sandbox

Param, więc pozwoli mi to uruchomić w korzeniu?

Lub, co muszę zmienić w moim obecnym pliku dokera, więc pozwoli mi uruchomić go jako USER pptruser

Obecne problemy -

Działa jak

USER pptruser

Nie udało się przejść do nowej przestrzeni nazw: Obsługiwane wspornik przestrzeni nazw PID, obsługiwane, ale nie powiodło się: errno = operacja niedozwolona

Działa jak

root

Bieganie jako root bez --no-piaskownicy nie jest obsługiwany.

5
wuno 3 czerwiec 2018, 03:48

4 odpowiedzi

Najlepsza odpowiedź

Uderzałem podobny problem, próbując uruchomić chromu bez bezgłowego w pojemniku alpejskim, i najwyraźniej tak jest wiele innych (np. Tutaj Oto). Opcja --no-sandbox jest proste obejście, ale oczywiście słabą praktykę bezpieczeństwa. To, co zadziałało dla mnie ustawienie niestandardowej {x1}}.

Pobierz Ten plik (jeśli jesteś zainteresowany, zobacz Uwagi autora Oto). Następnie przejdź opcję --security-opt seccomp=path/to/chrome.json podczas uruchamiania dokowca lub określić tę samą opcję w swoim {x1}}, jeśli używasz jednego.

6
usethe4ce 30 grudzień 2018, 05:08

W swoim kodzie nodejs, gdy uruchomisz przeglądarkę, możesz przekazać argument --no-sandbox.

Przykład:-

const launchBrowser = async () => {
  puppetBrowser = await puppeteer.launch({
    args: ['--no-sandbox'],
    timeout: 10000,
  });
};
6
Golak Sarangi 26 czerwiec 2018, 08:15

Nie ma potrzeby limitu czasu,

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

2
backslashN 26 lipiec 2018, 13:03

Tło

Byłem op. Miesiące poszły i nadal widzę ludzi o podobnych problemach w całym Internecie. Kwestie github i tak. Ze względu na to, że chcę pokazać wszystkim, jak rozwiązałem ten problem.

Problem

Uruchamiający lalek na Debian nie powiedzie się z powodu brakujących libów.

Rozwiązanie

Udało mi się uruchomić aplikację za pomocą pliku dokowanego i dodanie opcji konfiguracji do lalkarza.

Przykłady

plik dokera

FROM node:8
ENV HOST 0.0.0.0
EXPOSE 8080
RUN apt-get update

# for https
RUN apt-get install -yyq ca-certificates
# install libraries
RUN apt-get install -yyq libappindicator1 libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6
# tools
RUN apt-get install -yyq gconf-service lsb-release wget xdg-utils
# and fonts
RUN apt-get install -yyq fonts-liberation

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN mkdir -p /usr/src/app/views

# install the necessary packages
RUN npm install

CMD npm run start

puppeteer

const browser = await puppeteer.launch({
          args: ['--no-sandbox', '--disable-setuid-sandbox'],
          ignoreHTTPSErrors: true,
          dumpio: false
        });

Mam nadzieję, że to pomoże. Zasadniczo podczas uruchamiania aplikacji zainstalujesz brakujące libs, skonfigurując plik dokera, wtedy, gdy aplikacja działa opcje konfiguracyjne przekazane do obiektu Puppeteera pozwoli na uruchomienie aplikacji na Debianie.

0
wuno 24 listopad 2018, 21:06