我希望我的代码使用在一个容器中运行的puppeteer并使用(也许通过“ executablePath”启动参数?)另一个容器中的chrome二进制文件。这可能吗?有任何已知的解决方案吗?
用例:
worker代码在多个k8 pod中运行(作为容器)。 “有时”(可能经常或不经常)工作人员需要利用操纵up来运行代码。我不想让docker庞大而受限,因为puppeteer / chrome容器只有1.5 GB(如果我没记错的话),我只是想从另一个运行中的容器中提供所需的二进制文件
注意:这不是关于将人偶装箱的问题,我知道这是有可能的
答案 0 :(得分:1)
与此答案一起here和here,这是您的操作方法。基本上,这个想法是在不同的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);