我希望我的代码使用 puppeteer 在一个容器中运行,并使用(可能通过“executablePath”启动参数?)来自另一个容器的 chrome 二进制文件。这可能吗?有什么已知的解决方案吗?
使用案例:
工作代码在多个 k8 pod(作为容器)中运行。“有时”(可能经常或不经常)工作人员需要使用 puppeteer 运行代码。我不想让 docker 变得巨大且受限,因为 puppeteer/chrome 容器是(1.5 GB,如果我没记错的话),我只想从另一个正在运行的容器为我的代码提供所需的二进制文件
注意:这不是关于容器化 puppeteer 的问题,我知道这是一种可能性
除了此处和此处的答案之外,您还可以通过以下方法执行此操作。基本上,这个想法是在不同的 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)