docker - 在 Docker 容器中从 Chrome-Headless 请求 webSocketDebuggerUrl

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

设置

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

问题

要实际连接到容器内的 chrome,我首先需要检索 webSocketDebuggerUrl,它位于 http://0.0.0.0:9222/json/version。 chrome-headless.

问题是:我对这条路径的请求总是失败

RequestError: Error: connect ECONNREFUSED 0.0.0.0:9222

并且无法让 webSocketDebuggerUrl 连接到 chrome。

更多信息

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

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

StatusCodeError: 500 - "Host header is specified and is not an IP address or localhost."

我的代码(抽象)

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 })

最佳答案

好吧,因为来自 500 的错误消息说“主机已指定”,我只是将该 header 设置为空,现在我可以成功请求 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 })

关于docker - 在 Docker 容器中从 Chrome-Headless 请求 webSocketDebuggerUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53867751/

相关文章:

docker - 从通过compose启动的容器访问运行中的容器

node.js - 让 Puppeteer 等待给定的类出现/渲染在页面上?

node.js - 是否可以使用其 contextId 关闭 Puppeteer 浏览器?

java - docker 运行 nginx 加 jar

docker - 无法通过 Digital Ocean 液滴在 Docker 上使用 Shiny 进行端口映射

python - 如何检测一个是否在 Python 的 docker 容器中运行?

docker 在 dockerfile 和 docker-compose.yml 中使用通用配置

angular - 提供静态文件时,nginx docker 容器出现 Forbidden 403 错误

docker - 使用XPack设置ElasticSearch和Kibana图像

javascript - 用户触发事件后解析 puppeteer 中的 page.evaluate()