从Docker容器中的Chrome-Headless请求webSocketDebuggerUrl

时间:2018-12-20 11:26:09

标签: docker docker-compose puppeteer google-chrome-headless

设置

尝试在我的docker-compose中将chrome无头作为容器运行(图像:https://hub.docker.com/r/alpeware/chrome-headless-trunk),并从另一个容器连接到它。

问题

要实际连接到容器内的chrome,我首先需要检索webSocketDebuggerUrl,该浏览器可以在无头chrome的http://0.0.0.0:9222/json/version上找到。

问题是:我对此路径的请求始终失败

  

RequestError:错误:连接ECONNREFUSED 0.0.0.0:9222

并且无法获取webSocketDebuggerUrl连接到chrome。

更多信息

如果我自己在浏览器中访问http://0.0.0.0:9222/json/version,将URL复制并硬编码到我的puppeteer.connect()中,如果我将地址“ 0.0.0.0”替换为我的IP地址,它也只能按预期工作(链接的)容器名称(在docker-compose中指定):http://chrome:9222/json/version

如果我在使用容器名称地址(http://chrome:9222/json/version)时尝试从/ json / version请求webSocketDebuggerUrl,则会收到错误消息

  

StatusCodeError:500-“指定了主机头,它不是IP地址或本地主机。”

我的代码(抽象)

const rp = require('request-promise')
const puppeteer = require('puppeteer-core')

let url = await rp({uri:'http://0.0.0.0:9222/json/version', json: true }).then(res => res.webSocketDebuggerUrl)
let browser = await puppeteer.connect({ browserWSEndpoint: url })

1 个答案:

答案 0 :(得分:1)

好吧,由于来自500的errorMessage表示“已指定主机”,因此ist只是将该标头设置为空,现在我可以成功请求webSocketDebuggerUrl。

该解决方案有点笨拙,因此,如果有人对如何改进它有任何建议,我会很高兴:

const puppeteer = require('puppeteer-core')
const rp = require('request-promise')      

let websocket = await rp({uri:'http://chrome:9222/json/version', json: true, headers: {'Host': ''} })
       .then(res => res.webSocketDebuggerUrl.replace('ws://','ws://chrome:9222'))
let browser = await puppeteer.connect({ browserWSEndpoint: websocket })