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
を追加し、Dockerfile
のyarn install
をnpm install
に置き換えてみました。
クロムと一緒に操り人形師を期待どおりに使用するために何を変更する必要がありますか?
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
app:
restart: always
build: ${REPO}
volumes:
- ${REPO}/code:/usr/src/app:ro
working_dir: /usr/src/app
ports:
- "8087:5000"
app.post('/img', function (req, res) {
const puppeteer = require('puppeteer');
(async() => {
const browser = await puppeteer.launch({args: ['--no-sandbox']});
})();
});
私が使用していたDockerボリュームは、ローカルのcode
ディレクトリ全体をDockerコンテナーの/usr/src/app
ディレクトリにマッピングしました。
これは、開発中にコードをすばやく更新できるようにするのに最適です。
ただし、以前にdocker containerにインストールされていたchromiumのバージョンを、Dockerfile
のyarn 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
これは、コンテナが独自のバージョンの.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
私はこの問題に遭遇し、簡単な解決策を残したいと思いました。 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
みなさん、このリンクにアクセスしてください。これは、Dockerコンテナー内でヘッドレスパペットを起動する場合に非常に役立ちます。
https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md
これは私のプロジェクトコード構造です
Dockerがインストールされていることを確認してください。インストールしたら、次の手順を実行できます
Dockerディレクトリ内でdocker-compose up --buildを実行します
そして、これはdocker内のヘッドレスchromeに関する私のリポジトリです。
別の代替手段は、独自のVM /コンテナーで https://github.com/joelgriffith/browserless のようなものを使用することです。この方法では、ホストサーバーとChrome executorの間でリソースを共有しません。