使用来自另一个容器的容器化的Chrome二进制文件运行木偶程序

时间:2018-08-07 19:31:12

标签: node.js puppeteer

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

用例:

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

注意:这不是关于将人偶装箱的问题,我知道这是有可能的

1 个答案:

答案 0 :(得分:1)

与此答案一起herehere,这是您的操作方法。基本上,这个想法是在不同的docker上运行chrome并从另一个docker连接到它,然后在需要时使用它。它将需要一些维护,错误处理,超时和并发性,但这不是这里的问题。

大师

您将人偶保存在主帐户中,使用PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = true在其中安装人偶时,您没有安装chrome,请使用此人连接到在另一个docker上运行的辅助人偶。

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

工人

您在此处设置了完全运行的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);