Docker (node:8.15-alpine) + Chromium + Karma 单元测试不工作

Docker (node:8.15-alpine) + Chromium + Karma unit tests not working

我正在尝试 运行 使用 Chromium 和 Karma 在 Docker (node:8.15-alpine) 上进行我的前端测试,但是我遇到了很多与 ChromeHeadless 相关的错误。

这些测试曾经有效,但最近突然停止了,所以我猜这与第三方依赖项(apk?)或本地 Docker 安装有关。

我在 repo 上创建了一个分支,使用 运行 命令重现了这个问题。 README.md 这里: https://github.com/olivercaine/react-redux-starter-kit-extended/tree/bug/cant-run-unit-tests-in-docker

如有任何帮助,我们将不胜感激!

谢谢。

预期结果:

[output of passed tests...]
Finished in 0.026 secs / 0.031 secs @ 19:53:44 GMT+1100 (AEDT)
SUMMARY:
✔ 46 tests completed

实际结果:

13 02 2020 09:10:45.314:ERROR [launcher]: Cannot start ChromeHeadless

13 02 2020 09:10:45.316:ERROR [launcher]: ChromeHeadless stdout:
13 02 2020 09:10:45.317:ERROR [launcher]: ChromeHeadless stderr:
13 02 2020 09:10:45.772:ERROR [launcher]: Cannot start ChromeHeadless

13 02 2020 09:10:45.772:ERROR [launcher]: ChromeHeadless stdout:
13 02 2020 09:10:45.773:ERROR [launcher]: ChromeHeadless stderr:
13 02 2020 09:10:45.939:ERROR [launcher]: Cannot start ChromeHeadless

13 02 2020 09:10:45.939:ERROR [launcher]: ChromeHeadless stdout:
13 02 2020 09:10:45.939:ERROR [launcher]: ChromeHeadless stderr:
13 02 2020 09:10:46.424:ERROR [launcher]: ChromeHeadless failed 2 times (cannot start). Giving up.

Finished in 0 secs / 0 secs @ 09:10:46 GMT+0000 (UTC)

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! react-redux-starter-kit@3.0.1 test: `cross-env NODE_ENV=test karma start build/karma.config`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the react-redux-starter-kit@3.0.1 test script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-02-13T09_10_46_935Z-debug.log

更新:

上面的 URL 已被删除,但是可以在此处找到完整的(现在可用的)存储库:

https://github.com/olivercaine/react-redux-starter-kit-extended/tree/modpack/latest

您使用的 node:8-alpine 图像似乎存在一些问题。参见 https://github.com/puppeteer/puppeteer/issues/379。我不知道这是否是同一个问题,但我能够 运行 使用 node:8.15-slim 作为基本 Dockerfile[=14] 的基本图像进行测试=]

您还需要更新您的开发 Dockerfile:

FROM olliecaine/base:master

WORKDIR /project

# Install Chrome
RUN apt update && apt install -y chromium

理想情况下,您可以将 ENV CHROME_BIN=/usr/bin/chromium 添加到此 Dockerfile,但由于某些原因,这没有正确设置变量。

自己检查,并在 build/karma.config.js 文件的开头插入 console.log(process.env.CHROME_BIN),您将看到值在 运行 进行测试时仍然是 /usr/bin/chromium-浏览器。

作为解决方法,我必须在 build/karma.config.js 文件的开头插入此行:

process.env.CHROME_BIN = '/usr/bin/chromium'

如果你明白为什么 ENV 指令不起作用,请告诉我,我很感兴趣。

感谢 Baptiste,您的回答帮助我验证了修复是否有效。 基本上我最终做的是对 alpinelinux.org 使用不同的 URL。

最后我把Dockerfile改成了:

FROM node:8.15-alpine

WORKDIR /project

# Install Chrome
RUN echo http://dl-cdn.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories \
    && echo http://dl-cdn.alpinelinux.org/alpine/edge/main >> /etc/apk/repositories \
    && echo http://dl-cdn.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories \
    && apk --no-cache update && apk --no-cache upgrade \
    && apk add --no-cache chromium \
    && rm -rf /var/cache/apk/* /tmp/*

ENV CHROME_BIN /usr/bin/chromium-browser

这似乎正确设置了 CHROME_BIN env 变量,允许我在 Alpine 容器中 运行 我的测试。也意味着我也不需要更新 karma.config.js 文件。以前我使用 nl.alpinelinux.org/alpine/v3.8/ 而不是 edge.

为您的帮助干杯!