【问题标题】:How can my containerized Puppeteer talk to my host machine Chrome?我的容器化 Puppeteer 如何与我的主机 Chrome 通信?
【发布时间】:2018-07-04 14:15:51
【问题描述】:

我让 Puppeteer 在一个容器中工作,该容器有自己的无头 Chrome/Chromium,它将连接到我在不同容器上运行的 Web 应用程序。一切正常。

我希望容器内的 Puppeteer 使用我的主机 Google Chrome(或 Chromium,没关系)运行我的网络应用程序。我一直在寻找类似的东西,但没有找到关于这件事的文档。

我该怎么做?

【问题讨论】:

    标签: google-chrome docker puppeteer


    【解决方案1】:

    告诉 puppeteer 连接到本地机器上的 chrome 实例,而不是 docker 容器中的无头版本

    1. 通过在终端上运行 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 在调试模式下运行 chrome/chromium。这应该会给你一个 Websocket 调试 url。这应该如下所示:ws://host.docker.internal:9222/devtools/browser/d7db2629-0930-4741-a6ca-78ff70863c20

    2. 在您的 docker 开发设置中,告诉 docker 公开端口 9222。这是我们指定的chrome的调试端口。在运行 puppeteer 的服务的 yml 部分中:

    service-name:
      build: "..."
      volumes:
        - ....
        - ....
      ports:
        - 3010:3010
        - 9222:9222  <--- Add this
    

    然后重新初始化/重启 docker 容器

    docker-compose down
    docker-compose up
    
    1. 现在在代码更改中:
    const browser = await puppeteer.launch({ args });
    

    const browser = await puppeteer.connect({
      browserWSEndpoint:
        "ws://host.docker.internal:9222/devtools/browser/d7db2629-0930-4741-a6ca-78ff70863c20"
    });
    

    现在 puppeteer 应该连接到您本地计算机上的 chrome,您应该会看到它实时执行所有操作! ?

    PS:

    或者如果您不想一次又一次地复制生成的 url。 你可以这样做

    
    const response = await axios.get(
      "http://host.docker.internal:9222/json/version",
      {
        headers: { Host: "127.0.0.1:9222" }
      }
    );
    const browserWSEndpoint = response.data.webSocketDebuggerUrl.replace(
      /127.0.0.1/g,
      "host.docker.internal"
    );
    const browser = await puppeteer.connect({ browserWSEndpoint });
    

    这可以从 chrome 中获取调试 websocket url

    【讨论】:

    • 这太棒了,非常感谢!!给其他人的小提示(或者如果您不介意编辑消息):不需要在容器上公开端口,因为我们不会在该端口上公开任何内容,而是访问主机的 chrome 实例
    • 尝试使用端口公开,我得到“端口已在使用”,因为该端口由我在主机上运行的 chrome 实例使用。没有它,我在连接时得到 ECONNREFUSED。其他人有类似的经历吗?
    【解决方案2】:

    您可以将 puppeteer 指向您想在 puppeteer.launch 方法中使用的 Chrome/Chromium 可执行文件:

    puppeteer.launch({ executablePath : 'path/to/chromium" }); 
    

    所以理论上你可以使用 Chromium 从主机挂载一个目录到 Docker 并将 puppeteer 指向它。

    【讨论】:

    • 你能再扩展一点吗?我不知道为 Mac 编译的 Chrome 可执行文件如何能够与位于 Linux 容器中的 Puppeteer 一起运行;即使已安装。
    • 好吧,如果操作系统不同(从问题中不清楚),那么它当然不会工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多