Docker (узел: 8.15-alpine) + Chromium + модульные тесты Karma не работают

Я пытаюсь запустить свои внешние тесты на Docker (узел: 8.15-alpine) с использованием Chromium и Karma, однако получаю много ошибок, связанных с ChromeHeadless.

Раньше эти тесты работали, но недавно они внезапно остановились, поэтому я предполагаю, что это связано либо со сторонней зависимостью (apk?), либо с локальной установкой Docker.

Я создал ветку в репозитории с простой в использовании командой, которая воспроизводит проблему. 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! [email protected] test: `cross-env NODE_ENV=test karma start build/karma.config`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] 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


person Oliver Caine    schedule 13.02.2020    source источник


Ответы (2)


Кажется, есть некоторые проблемы с изображением node:8-alpine, которое вы используете. См. https://github.com/puppeteer/puppeteer/issues/379. Я не знаю, является ли это той же проблемой, но я смог запустить ваши тесты, используя node:8.15-slim в качестве базового образа вашего базового файла Dockerfile.

Вам также необходимо обновить свой dev Dockerfile:

FROM olliecaine/base:master

WORKDIR /project

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

В идеале вы должны добавить ENV CHROME_BIN=/usr/bin/chromium в этот Dockerfile, но по какой-то причине это не устанавливает переменную должным образом.

Чтобы убедиться в этом самостоятельно, вставьте console.log(process.env.CHROME_BIN) в начало файла build/karma.config.js. При выполнении тестов вы увидите, что значение по-прежнему равно /usr/bin/chromium-browser.

В качестве обходного пути мне пришлось вставить эту строку в начало файла build/karma.config.js:

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

Дайте мне знать, если вы понимаете, почему инструкция ENV не работает, мне интересно.

person Baptiste Bouchereau    schedule 13.02.2020
comment
Да, ты совершенно прав.. как странно! Я собираюсь поэкспериментировать со стороной apk, чтобы посмотреть, смогу ли я найти правильное исправление. Тем временем, хотя ваш разблокировал меня... ура! - person Oliver Caine; 14.02.2020

Спасибо, Батист, ваш ответ помог мне убедиться, что исправление работает. По сути, в итоге я использовал другой URL-адрес для alpinelinux.org.

В конце концов я изменил 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

который, казалось, правильно установил переменную env CHROME_BIN, что позволило мне запустить мои тесты в контейнере Alpine. Также это означало, что мне не нужно было обновлять файл karma.config.js. Раньше я использовал nl.alpinelinux.org/alpine/v3.8/ вместо edge.

Спасибо за вашу помощь!

person Oliver Caine    schedule 18.02.2020