Запрос webSocketDebuggerUrl из Chrome-Headless в контейнере Docker

Настраивать

Попытка запустить chrome без головы в качестве контейнера (изображение: https://hub.docker.com/r/alpeware/chrome-headless-trunk) в моем docker-compose и подключении к нему из другого контейнера.

Проблема

Чтобы на самом деле подключиться к chrome внутри контейнера, мне сначала нужно получить webSocketDebuggerUrl, который доступен по адресу http://0.0.0.0:9222/json/version файла chrome-headless.

Проблема в том, что мой запрос на этот путь всегда терпит неудачу с

RequestError: Ошибка: подключить ECONNREFUSED 0.0.0.0:9222

и не могу заставить webSocketDebuggerUrl подключиться к хрому.

Еще немного информации

Также, если я посещу http://0.0.0.0:9222/json/version в своем браузере сам, скопируйте URL-адрес и жестко закодируйте его в мой puppeteer.connect (), он работает ТОЛЬКО так, как ожидалось, если я заменю адрес «0.0.0.0» на мое (связанное) имя контейнера (указанное в docker-compose): http://chrome:9222/json/version

Если я попытаюсь запросить webSocketDebuggerUrl из /json/version, используя адрес имени контейнера (http://chrome:9222/json/version) я получаю сообщение об ошибке

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

person Seltsam    schedule 20.12.2018    source источник


Ответы (1)


Что ж, поскольку в сообщении об ошибке из 500 говорится, что «хост указан», я просто установил пустой заголовок, и теперь я могу успешно запросить 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 })
person Seltsam    schedule 20.12.2018