一尘不染

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

node.js

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

用例:

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

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


阅读 318

收藏
2020-07-07

共1个答案

一尘不染

除了这里和这里的答案之外,这是您如何执行此操作的方法。基本上,这个想法是在其他docker上运行chrome并从另一个docker连接到docker,然后在需要时使用它。它将需要一些维护,错误处理,超时和并发,但这不是这里的问题。

puppeteer

您将puppeteer保存在主帐户上PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = true,使用来安装puppeteer时不安装chrome,而是使用它连接到在另一个docker上运行的辅助puppeteer。

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

websocket

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