web-dev-qa-db-ja.com

DockerコンテナのPuppeteer:Chromiumリビジョンはダウンロードされません

Docker-composeを使用して、Dockerコンテナーで実行される高速アプリでpuppeteerを起動しようとしています。

Puppeteer const browser = await puppeteer.launch({args: ['--no-sandbox']});を起動する行は、次のエラーをスローします。

(node:28) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): AssertionError [ERR_ASSERTION]: Chromium revision is not downloaded. Run "npm install"

yarn add puppeteerの後にyarn installを追加し、Dockerfileyarn installnpm installに置き換えてみました。

クロムと一緒に操り人形師を期待どおりに使用するために何を変更する必要がありますか?

ExpressアプリのDockerfile:

FROM node:8

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 code/package.json /usr/src/app
COPY code/index.js /usr/src/app
RUN mkdir -p /usr/src/app/views
COPY code/views/ /usr/src/app

# install the necessary packages
RUN yarn install

CMD npm run start:dev

docker-compose.yml:

app:
    restart: always
    build: ${REPO}
    volumes:
        - ${REPO}/code:/usr/src/app:ro
    working_dir: /usr/src/app
    ports:
        - "8087:5000"

index.jsルート:

app.post('/img', function (req, res) {
  const puppeteer = require('puppeteer');
  (async() => {
    const browser = await puppeteer.launch({args: ['--no-sandbox']});
  })();
});
9
ebbishop

私が使用していたDockerボリュームは、ローカルのcodeディレクトリ全体をDockerコンテナーの/usr/src/appディレクトリにマッピングしました。

これは、開発中にコードをすばやく更新できるようにするのに最適です。

ただし、以前にdocker containerにインストールされていたchromiumのバージョンを、Dockerfileyarn installを介してmy machineにインストールされているchromiumのバージョンで上書きします。コマンドラインのyarn installを介して。

各マシンには、独自の正しいOS固有のバージョンのクロムが必要です。 DockerコンテナーにはLinux固有のクロム(linux-515411)が必要ですが、私のラップトップにはMac固有のクロム(mac-508693)が必要です。 yarn installでpuppeteerを使用してnpm install(またはpackage.json)を実行するだけで、正しいバージョンのchromeiumのインストールが処理されます。

以前のプロジェクト構造:

.
├── Dockerfile
├── README.md
└── code
    ├── index.js
    ├── package.json
    └── node_modules
        ├── lots of other node packages
        └── puppeteer
            ├── .local-chromium
            │     └── mac-508693 <--------good for macs, bad for linux!
            ├── package.json
            └── all the other puppeteer files

部分的なDockerfile

これは、コンテナが独自のバージョンの.local-chromiumを取得する場所です。

FROM node:8

RUN apt-get update

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY code/package.json /usr/src/app
COPY code/index.js /usr/src/app

# install the necessary packages <------ including puppeteer, with the correct chromium
RUN yarn install

CMD npm run start:dev

docker-compose.ymlの以前のボリューム

これにより、ローカル${REPO}/codeからDockerコンテナーの/usr/src/appディレクトリにすべてがコピーされます。 間違ったバージョンのクロムを含みます。

volumes:
    - ${REPO}/code:/usr/src/app:ro

更新されたプロジェクト構造:

.
├── Dockerfile
├── README.md
└── code
    ├── src
    │   ├── index.js
    │   └── package.json
    └── node_modules
        ├── lots of other node packages
        └── puppeteer
            ├── .local-chromium
            ├── package.json
            └── all the other puppeteer files

更新されたDockerボリュームは、ローカル./code/srcのコンテンツ全体をDockerコンテナーの/usr/src/appにマッピングします。これには、node_modulesディレクトリが含まれる[〜#〜] [〜#〜]は含まれません。

volumes:
    - ${REPO}/code/src:/usr/src/app:ro
3
ebbishop

私はこの問題に遭遇し、簡単な解決策を残したいと思いました。 chrome installが見つからなかったのは、テストのためにローカルボリュームをコンテナにマウントしたためです。Macを使用しているため、ローカルnpm installがMacを提供しましたクロムのバージョン。そのnode_modulesフォルダがLinuxコンテナにマウントされたとき、そこにはなかったLinuxバージョンが見つかると予想されていました。

これを回避するには、コンテナーにボリュームをマウントするときにnode_modulesフォルダーを除外する必要があります。別のvolumeパラメータを渡すことでそれを行うことができました。

docker run -rm \
  --volume ~/$project:/dist/$project \
  --volume /dist/$project/node_modules
1
Marco

みなさん、このリンクにアクセスしてください。これは、Dockerコンテナー内でヘッドレスパペットを起動する場合に非常に役立ちます。

https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md

これは私のプロジェクトコード構造です

  • 設定
  • マイグレーション
  • モデル
  • utils
  • .dockerignorefile
  • app.js
  • docker-compose.yml
  • Dockerfile
  • package.json

Dockerがインストールされていることを確認してください。インストールしたら、次の手順を実行できます

Dockerディレクトリ内でdocker-compose up --buildを実行します

そして、これはdocker内のヘッドレスchromeに関する私のリポジトリです。

https://github.com/frayhan94/mandiri-scrap

0
Faris Rayhan

別の代替手段は、独自のVM /コンテナーで https://github.com/joelgriffith/browserless のようなものを使用することです。この方法では、ホストサーバーとChrome executorの間でリソースを共有しません。

0
griffith_joel