PuppeteerをDockerやHerokuで動かすメモ
tl;dr
Docker
まず、素直に公式ドキュメントに書いてあるサンプルコードでイメージを作成します。 あくまで puppeteer を動作させるための土台として活用したいため、他のコードは混ぜません。
FROM node:8-slim # Install latest chrome (dev) package. # Note: this also installs the necessary libs so we don't need the previous RUN command. RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - &&\ sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' &&\ apt-get update &&\ apt-get install -y google-chrome-unstable # Uncomment to skip the chromium download when installing puppeteer. If you do, # you'll need to launch puppeteer with: # browser.launch({executablePath: 'google-chrome-unstable'}) # ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true # Install puppeteer so it can be required by user code that gets ran in server.js. RUN yarn add puppeteer CMD ["google-chrome-unstable", "--no-sandbox"]
作成したイメージをベースに、別のプロジェクトとしてディレクトリを作成し、 Dockerfile を用意します。
FROM syon/puppeteer
で先ほど作った土台を使用しています。
Dockerfile
FROM syon/puppeteer WORKDIR /work COPY . /work RUN npm install --silent CMD ["npm", "start"]
以下はサンプルプロジェクトの構成です。
files
. ├── Dockerfile ├── main.js ├── package.json └── result ├── example.pdf └── example.png
Dockerイメージ側にグローバルでインストールをしていますが、改めて puppeteer
に依存させています。
前者は Chromium をイメージ内にインストールするため、後者はアプリケーションが利用するためです。
package.json
{ "name": "pptr", "version": "0.0.0", "private": true, "scripts": { "start": "node main.js" }, "dependencies": { "puppeteer": "^0.10.2" } }
こちらは puppeteer の動作確認をするためのサンプルコードです。
main.js
const puppeteer = require('puppeteer'); (async() => { const browser = await puppeteer.launch({ args: [ '--no-sandbox', '--disable-setuid-sandbox' ] }); const page = await browser.newPage(); await page.goto('https://example.com', { waitUntil: 'networkidle' }); await page.screenshot({ path: '/result/example.png' }); await page.pdf({ path: '/result/example.pdf' }); browser.close(); })();
Dockerイメージをビルドして実行します。
オプション -v $(pwd)/result:/result
にて生成ファイルを受け取っています。
$ docker build -t pptr . $ docker run --rm -v $(pwd)/result:/result pptr
Heroku
Heroku で動かす方法も公式から案内されています。ありがたいことに、ビルドパックを用意してくださっています。
Buildpacks
heroku/nodejs
https://github.com/jontewks/puppeteer-heroku-buildpack.git
Node.js Versionの指定
Heroku がデフォルトで提供しているのは Node.js v6 です。 サンプルのJSが async/await を使っているので、 v6 では動作しません。 v8 を指定します。
{ "name": "myapp", "description": "a really cool app", "version": "1.0.0", "engines": { "node": "8.4.0" } }
おわり。