web-dev-qa-db-ja.com

ノードjsとクロムヘッドレスを備えたdockerAlpine-puppeter-の起動に失敗しましたchrome

AlpineLinuxのDockerコンテナ内からカスタムノードコマンドを実行しようとしています。

インストールされているパッケージ:

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

ノードパッケージ(npm list --depth=0):

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

しかし、私はいくつかのエラーを経験しています:

/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.

クロムをインスタンス化できないようです。また、ブラウザのインス​​タンスを次のように作成するときに、render.jsスクリプトを変更しようとしました。

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

しかし、私は同じ結果を得ました。これについて何か助けはありますか?

5
Luke

これは私のために働いた

Puppeteer v0.13.を使用します。このコメントを書いている時点で、Puppeteerの最新バージョンはAlpineLinuxのクロムと互換性がありません。

PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true" Puppeteerのインストール時に、デフォルトバージョンのChromiumのダウンロードをスキップします。

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:

次の設定を使用して、インストールされているChromiumバージョンを使用するようにPuppeteerに指示する必要があります-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
  });
4
Sohail

PuppeteerをAlpineで動作させたい場合は、古いバージョンのChromeで動作する古いバージョンのpuppeteerを使用してみてください。 AlpineでサポートされているChromeの最新バージョンは63です。これは、操り人形師バージョン0.11.0の開発中に使用されたChromeのバージョンです。

npm install --save [email protected]

このバージョンのChromeは、Alpine Edgeでのみ見つかります。以下を実行することにより、古いバージョンのAlpineにインストールできます。

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

次の構成で操り人形師を開始してください

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({
  executablePath: process.env.CHROME_BIN || null,
  args: ['--no-sandbox', '--headless', '--disable-gpu']
});
4
Jam Risser

Dockerがオプションである場合は、多くの苦痛を取り除くことができるので、強くお勧めします。 ChromiumはほとんどのLinuxフレーバーで動作しますが、正しく動作する前に多数のパッケージをインストールする必要がありました(そして、その後も対処すべきフォントがあります)。

完全な開示:私はリポジトリとDockerイメージを維持しています(ここにあります: https://hub.docker.com/r/browserless/chrome/ )。これは、対応するpuppeteerバージョンと歩調を合わせているため、遅れはほとんどありません。

DockerなしでChromeを正しくインストールする方法を理解したい場合は、ここでDockerfileを読んでください: https://github.com/joelgriffith/browserless/blob/master/Dockerfile#L27

0
browserless