使用来自另一个容器的容器化 chrome 二进制文件运行 puppeteer

alo*_*ser 6 node.js puppeteer

我希望我的代码使用 puppeteer 在一个容器中运行,并使用(可能通过“executablePath”启动参数?)来自另一个容器的 chrome 二进制文件。这可能吗?有什么已知的解决方案吗?

使用案例:

工作代码在多个 k8 pod(作为容器)中运行。“有时”(可能经常或不经常)工作人员需要使用 puppeteer 运行代码。我不想让 docker 变得巨大且受限,因为 puppeteer/chrome 容器是(1.5 GB,如果我没记错的话),我只想从另一个正在运行的容器为我的代码提供所需的二进制文件

注意:这不是关于容器化 puppeteer 的问题,我知道这是一种可能性

Md.*_*her 4

除了此处此处的答案之外,您还可以通过以下方法执行此操作。基本上,这个想法是在不同的 docker 上运行 chrome 并从另一个 docker 连接到它,然后在我们需要时使用它。它需要一些维护、错误处理、超时和并发性,但这不是这里的问题。

掌握

您将 puppeteer 保存在主帐户上,在安装 puppeteer 时不安装 chrome PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = true,使用此帐户连接到在另一个 docker 上运行的工作 puppeteer。

const browser = await puppeteer.connect({
    browserWSEndpoint: "ws://123.123.123.123:8080",
    ignoreHTTPSErrors: true
});
Run Code Online (Sandbox Code Playgroud)

工人

您在这里设置了一个完全运行的 chrome,公开了 websocket。有不同的方法可以做到这一点。这是最简单的一个。

const http = require('http');
const httpProxy = require('http-proxy');

const proxy = new httpProxy.createProxyServer();

http
  .createServer()
  .on('upgrade', async(req, socket, head) => {
      const browser = await puppeteer.launch();
      const target = browser.wsEndpoint();

      proxyy.ws(req, socket, head, { target })
  })
  .listen(8080);
Run Code Online (Sandbox Code Playgroud)