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 にて生成ファイルを受け取っています。

bash

$ 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"
  }
}

おわり。