首页 > 解决方案 > 在 WSL2 中运行的 Docker 容器中运行 headful Puppeteer

问题描述

所以我有一台运行 VcXsrv 的 Windows 10 机器。我已经安装了 WSL2,在我的 WSL2 环境中,我可以在 Headful 模式下运行我的 Node.js Puppeteer 应用程序而不会出现问题。

这里的问题是我现在想在 WSL2 上运行的 Docker 容器中运行应用程序,而不是直接在 WSL2 中运行。我已经设置了一个 docker 容器,并且该应用程序在无头模式下工作,但我不知道如何配置 Docker 容器以连接到在 Windows 主机上运行的 X 服务器。

连接必须从 Docker 到 WSL2,然后到 Windows。

puppeteer 抛出的错误非常通用:

(node:92) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
Fontconfig warning: "/etc/fonts/fonts.conf", line 100: unknown element "blank"
[110:110:0729/163412.032352:ERROR:browser_main_loop.cc(1417)] Unable to open X display.


TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md

    at onClose (/var/www/html/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:193:20)
    at ChildProcess.<anonymous> (/var/www/html/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:184:79)

我在 docker 容器内设置了 DISPLAY 环境变量,使其具有与我的 WSL2 环境相同的值:

workspace@d1d60e8e27a5:/var/www/html$ echo $DISPLAY
172.30.240.1:0.0

当直接在 WSL2 中运行应用程序时,此相同的值有效

标签: node.jsdockerpuppeteerwsl-2

解决方案


奇迹般地它开始工作了。基本上,如果在 WSL2 中一切正常,那么您只需将 DISPLAY env var 重新导出到 Docker 容器,它就可以工作了。为此,您可以在 docker-compose.yml 文件中指定不带值的 env var,该文件将使用 env 变量在主机(本例中为 WSL2)上的值。

env:
 - DISPLAY
 - SOMETHING=else

推荐阅读