在Docker容器上运行Puppeteer


后记

本文发布于2017年8月8日,已过时。
当前(截至2019年2月4日),官方存储库显示了如何使用Docker运行它,因此我认为最好参考它。

  • GoogleChrome / puppeteer?问题排查?在Docker中运行Puppeteer

介绍

最近,我沉迷于触摸木偶戏。这是一个库,可让您通过Node.js使用Headless Chrome。我以为,如果可以在Docker容器上运行此Puppeteer,则可以在各种环境中运行浏览器,这将很方便,所以我尝试了一下。

方法

官方存储库假定在Docker容器上运行Google Chrome / puppeteer的README.md中的示例程序的经过稍微编辑的版本。将node:8.4.0用于Docker映像。

首先,准备一个示例程序,并仅更改puppeteer.launch()的参数,如下所示。这是因为它在Linux SUID沙箱环境中无法正常工作。

script.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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');
  await page.screenshot({ path: 'example.png' });

  browser.close();
})();

接下来,准备Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
FROM node:8.4.0

RUN apt-get update \
 && apt-get install -y \
      gconf-service \
      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 \
      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 \
      ca-certificates \
      fonts-liberation \
      libappindicator1 \
      libnss3 \
      lsb-release \
      xdg-utils \
      wget

WORKDIR /app
RUN npm i puppeteer

COPY ./script.js .

ENTRYPOINT ["node", "/app/script.js"]

对于

apt-get命令安装的库,我提到了Debian Dependency of Puppeteer?故障排除。本文档还提到了上面提到的puppeteer.launch()参数。

之后,执行docker builddocker run,就可以了。如果执行示例程序时拍摄的屏幕快照的图像文件example.png位于执行docker run的目录中,则表示成功。:tada:

1
2
3
$ docker build -t puppeteer .
$ docker run --rm -it -v $(pwd):/opt/data-volume -w /opt/data-volume puppeteer
$ open example.png

スクリーンショット 2017-08-31 21.28.40.png

参考

  • Puppeteer?故障排除
  • Puppeteer?问题#290?Chrome Headless无法在Debian上启动