puppeteer 无头 chrome 是否在 Azure App Service 的 Windows 容器中工作?



>UPDATE

正如@Joaquín所说,基础映像缺少依赖项。经过大量的研究以及反复试验,我决定使用繁重的服务器核心图像以及Chrome所需的必要字体。你可以在我的github上找到我的测试应用程序和Dockerfile。

我能够让它作为 Windows 容器在 Azure 应用服务中运行,但该映像比我的 Linux 版本大很多倍,启动时间也慢得多。我对 Docker 容器还很陌生,所以到目前为止它很有趣。


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

然而,它在 Azure 应用服务的 Linux 容器中完美运行。我是否必须做一些特别的事情才能让它在 Windows 容器中工作?还是由于 Windows 应用服务(容器与否)中的沙盒限制而徒劳无功?不过,如果是这种情况,那么我本来会预料到一个spawn UNKNOWN错误......

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

  1. ignoreDefaultArgs: ['--disable-extensions'](每个故障排除)

  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:appnode_modulespuppeteerlibLauncher.js:349:14)
at Interface.helper.addEventListener (C:appnode_modulespuppeteerlibLauncher.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.

Dockerfile

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,我想重现该问题。

最新更新