puppeteer headless chrome 是否在 Azure 应用服务的 Windows 容器中工作?

Does puppeteer headless chrome work in a Windows container in Azure App Service?

更新

正如@Joaquín 所说,基础镜像缺少依赖项。经过大量研究和反复试验后,我决定使用繁重的 servercore 映像以及必要的 fonts required by Chrome. You can find my test app and Dockerfile on my github

我能够在 Azure App Service 中将它 运行 作为 Windows 容器获取,但图像比我的 Linux 版本大很多倍,启动时间也慢得多。我对 Docker 容器还是很陌生,所以到目前为止它很有趣。


运行 我在 Azure 应用服务的 Windows 容器中的人偶应用最终以 UnhandledPromiseRejectionWarning: Error: Failed to launch chrome!

然而,它在 Azure 应用服务的 Linux 容器中完美运行。我是否必须做一些特别的事情才能让它在 Windows 容器中工作?还是由于 Windows 应用程序服务(容器或非容器)中的 sandboxing limitations 而无用?不过,如果是这种情况,那么我会预料到 spawn UNKNOWN 错误...

我尝试过的一些事情包括使用以下 puppeteer.launch() 选项:

  1. ignoreDefaultArgs: ['--disable-extensions'](根据 troubleshooting

  2. executablePath: '<path_to_chromium>'

这是错误和堆栈跟踪

(node:1272) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome!


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

    at onClose (C:\app\node_modules\puppeteer\lib\Launcher.js:349:14)
    at Interface.helper.addEventListener (C:\app\node_modules\puppeteer\lib\Launcher.js:338:50)
    at Interface.emit (events.js:203:15)
    at Interface.close (readline.js:397:8)
    at Socket.onend (readline.js:173:10)
    at Socket.emit (events.js:203:15)
    at endReadableNT (_stream_readable.js:1129:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)
(node:1272) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:1272) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Docker文件

ARG core=mcr.microsoft.com/windows/servercore:ltsc2019
ARG target=mcr.microsoft.com/windows/nanoserver:1809
FROM $core as download

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

ENV NODE_VERSION 10.16.0

RUN Invoke-WebRequest $('https://nodejs.org/dist/v{0}/node-v{0}-win-x64.zip' -f $env:NODE_VERSION) -OutFile 'node.zip' -UseBasicParsing ; \
    Expand-Archive node.zip -DestinationPath C:\ ; \
    Rename-Item -Path $('C:\node-v{0}-win-x64' -f $env:NODE_VERSION) -NewName 'C:\nodejs'

FROM $target

COPY --from=download /nodejs/ /nodejs/

USER Administrator
RUN setx /M PATH "%PATH%;C:\nodejs"

RUN mkdir "C:\app"
WORKDIR "C:\app"

COPY . .

RUN npm install

EXPOSE 8000
CMD [ "node.exe", "server.js" ]

归结为 Windows 容器时,应用服务沙箱没有限制,因为 Hyper-V 被用作应用服务上容器的沙箱。

无法在容器内启动 chrome 的唯一原因是 Windows 容器的基础映像缺少 chrome 需要的某些依赖项。

如果你分享dockerfile,我想重现这个问题。