Тестовый запуск хрома TestCafe как часть сборки докера

По какой-то причине в нашем CI нам нужно запускать тесты узлов внутри контейнера docker (включая выборку зависимостей и т. д.). Итак, я пытаюсь запустить тесты пользовательского интерфейса как часть сборки докера.

Вот как выглядит мой Dockerfile:

FROM testcafe/testcafe:1.3.3

USER root

#some packages needed for some dependencies
RUN apk add --no-cache yarn python make build-base vim curl 

RUN ln -s /opt/testcafe/docker/testcafe-docker.sh /usr/local/bin/testcafe-docker

WORKDIR /usr/src/app

RUN yarn config set registry https://private-npm-registry --global

COPY package*.json ./

RUN yarn

COPY . .

RUN yarn test:ui:ci

# "test:ui:clean": "rm -rf uitests/reports"
# "test:ui:ci-debug": "yarn test:ui:clean; testcafe-docker 'chromium --no-sandbox' uitests/tests -S -s uitests/reports/screenshots --video uitests/reports/videos -r spec,json:uitests/reports/report.json,html:uitests/reports/report.html",
# "test:ui:ci": "start-server-and-test serve http://127.0.0.1:8080 test:ui:ci-debug"

я получаю ERROR Unable to establish one or more of the specified browser connections. This can be caused by network issues or remote device failure.

Кроме того, я пытался использовать пользователя user, но это дает ошибку разрешения при создании папки reports внутри папки uitests перед запуском тестов.

Я попробовал это с опцией --no-sandbox и без нее, получил ту же проблему. Также пробовал chromium:headless --no-sandbox, получил ту же ошибку.

Любое предложение, пожалуйста? Спасибо.

ОБНОВЛЕНИЕ. Также пробовали с пользователем: user (чтобы избежать проблем с разрешениями, используя папку /tmp для отчета) и получили ту же проблему:

20-Jul-2019 23:53:33    > yarn test:ui:clean; whoami; ls -sail; testcafe-docker 'chromium --no-sandbox' uitests/tests -S -s /tmp/uitests/reports/screenshots --video /tmp/uitests/reports/videos -r spec,json:/tmp/uitests/reports/report.json,html:/tmp/uitests/reports/report.html
20-Jul-2019 23:53:33    
20-Jul-2019 23:53:34    $ rm -rf /tmp/uitests/reports
20-Jul-2019 23:53:34    user
20-Jul-2019 23:53:34    total 528
20-Jul-2019 23:53:34         13      4 drwxr-xr-x   10 user     user          4096 Jul 20 13:52 .
20-Jul-2019 23:53:34         12      4 drwxr-xr-x    8 root     root          4096 Jul 20 13:52 ..
20-Jul-2019 23:53:34         79      4 -rw-r--r--    1 root     root            20 Jul 19 07:06 .dockerignore
20-Jul-2019 23:53:34         75      4 -rw-r--r--    1 root     root            45 Jul 19 07:06 .eslintignore
20-Jul-2019 23:53:34         83      4 -rw-r--r--    1 root     root           790 Jul 19 07:06 .eslintrc
20-Jul-2019 23:53:34         78      4 drwxr-xr-x    8 root     root          4096 Jul 20 13:48 .git
20-Jul-2019 23:53:34         82      4 -rw-r--r--    1 root     root           326 Jul 20 13:48 .gitignore
20-Jul-2019 23:53:34         87      4 -rw-r--r--    1 root     root           189 Jul 19 07:06 Dockerfile
20-Jul-2019 23:53:34         81      4 -rw-r--r--    1 root     root           592 Jul 20 13:48 DockerfileUITest
20-Jul-2019 23:53:34         89      4 -rw-r--r--    1 root     root           451 Jul 19 07:06 README.md
20-Jul-2019 23:53:34         90      4 drwxr-xr-x    3 root     root          4096 Jul 19 07:06 backend
20-Jul-2019 23:53:34       4096      4 drwxr-xr-x    3 user     user          4096 Jul 20 13:53 build
20-Jul-2019 23:53:34         85      4 -rwxr-xr-x    1 root     root           959 Jul 19 07:06 build.sh
20-Jul-2019 23:53:34         84      4 -rw-r--r--    1 root     root          1124 Jul 19 07:06 deploy.yaml
20-Jul-2019 23:53:34         91      4 drwxr-xr-x 1348 user     user          4096 Jul 20 13:52 node_modules
20-Jul-2019 23:53:34         74      4 -rw-r--r--    1 root     root          2959 Jul 20 13:48 package.json
20-Jul-2019 23:53:34         76      4 drwxr-xr-x    2 root     root          4096 Jul 19 07:06 public
20-Jul-2019 23:53:34         88      4 -rwxr-xr-x    1 root     root           742 Jul 19 07:06 runUITestsInCI.sh
20-Jul-2019 23:53:34         77      4 drwxr-xr-x    8 root     root          4096 Jul 19 07:06 src
20-Jul-2019 23:53:34         80      4 drwxr-xr-x    7 root     root          4096 Jul 19 07:06 uitests
20-Jul-2019 23:53:34         86    448 -rw-r--r--    1 root     root        454847 Jul 20 13:48 yarn.lock
20-Jul-2019 23:53:34    Using locally installed version of TestCafe.
20-Jul-2019 23:55:36    ERROR Unable to establish one or more of the specified browser connections. This can be caused by network issues or remote device failure.
20-Jul-2019 23:55:36    
20-Jul-2019 23:55:36    Type "testcafe -h" for help.

Обновление-2: Пробовал и с firefox, та же проблема: ERROR Unable to establish one or more of the specified browser connections. This can be caused by network issues or remote device failure.

Обновление-3: извините за задержку. Отвлекся на что-то другое. Пробовал как в CI, так и на локальной машине, и это было такое же поведение. Также попробовал предложение в комментарии echo -e '#!/bin/sh\n/usr/bin/chromium-browser --no-sandbox --remote-debugging-port=9222 --headless' > /usr/local/bin/testcafe-docker и получил следующий вывод как в CI, так и в локальной среде.

02-Dec-2019 18:45:17    DevTools listening on ws://127.0.0.1:9222/devtools/browser/711c6409-be9a-4e08-959e-0c994c8c5742
02-Dec-2019 18:45:17    [1202/074517.060637:ERROR:gl_implementation.cc(282)] Failed to load /usr/lib/chromium/swiftshader/libGLESv2.so: Error loading shared library /usr/lib/chromium/swiftshader/libGLESv2.so: No such file or directory
02-Dec-2019 18:45:17    [1202/074517.064824:ERROR:viz_main_impl.cc(176)] Exiting GPU process due to errors during initialization
02-Dec-2019 18:45:17    [1202/074517.072317:WARNING:dns_config_service_posix.cc(341)] Failed to read DnsConfig.
02-Dec-2019 18:45:17    [1202/074517.072782:WARNING:gpu_process_host.cc(1220)] The GPU process has crashed 1 time(s)
02-Dec-2019 18:45:17    [1202/074517.135149:ERROR:gl_implementation.cc(282)] Failed to load /usr/lib/chromium/swiftshader/libGLESv2.so: Error loading shared library /usr/lib/chromium/swiftshader/libGLESv2.so: No such file or directory
02-Dec-2019 18:45:17    [1202/074517.139203:ERROR:viz_main_impl.cc(176)] Exiting GPU process due to errors during initialization
02-Dec-2019 18:45:17    [1202/074517.143251:WARNING:gpu_process_host.cc(1220)] The GPU process has crashed 2 time(s)
02-Dec-2019 18:45:17    [1202/074517.208950:WARNING:gpu_process_host.cc(990)] Reinitialized the GPU process after a crash. The reported initialization time was 0 ms
02-Dec-2019 18:45:17    [1202/074517.209227:ERROR:gpu_channel_manager.cc(397)] ContextResult::kFatalFailure: Failed to create shared context for virtualization.

person Kumar Gaurav    schedule 19.07.2019    source источник
comment
Не могли бы вы проверить, воспроизводится ли проблема: - в Docker на вашем локальном компьютере? - в Docker на CI с образом TestCafe? Кроме того, вы можете заменить RUN ln -s /opt/testcafe/docker/testcafe-docker.sh /usr/local/bin/testcafe-docker в файле Docker этой строкой: RUN echo -e '#!/bin/sh\n/usr/bin/chromium-browser --no-sandbox --remote-debugging-port=9222 --headless' > /usr/local/bin/testcafe-docker; chmod +x /usr/local/bin/testcafe-docker и предоставить нам вывод Chrome.   -  person aleks-pro    schedule 22.07.2019
comment
обновленный исходный вопрос. Извините за задержку. У него есть vnc? можно ли увидеть браузер (не безголовый) внутри контейнера докеров?   -  person Kumar Gaurav    schedule 05.12.2019


Ответы (2)


Последние версии Chromium не позволяют запускать их под пользователем root. Измените пользователя с «root» на user перед запуском тестов TestCafe. Кроме того, вам необходимо настроить разрешение на создание новых папок. См. подробное объяснение в разделе записи в докере общих томов.

...
USER user
RUN yarn test:ui:ci
person mlosev    schedule 19.07.2019
comment
Я тоже пытался с user .. но это было то же самое .. обновил исходный вопрос. - person Kumar Gaurav; 20.07.2019
comment
Не могли бы вы привести пример образа докера без ваших личных вещей? - person mlosev; 05.12.2019
comment
Решено. Мой тест пытался открыть URL: localhost:8080.. смена на 127.0.0.1:8080 сработала. возможно, какая-то проблема с разрешением в контейнере докеров.. но было бы здорово, если бы сообщение об ошибке было более ясным.. например. couldn't reach localhost:8080. Возможности для будущих улучшений. - person Kumar Gaurav; 08.12.2019
comment
На самом деле это было из-за прокси. Мы используем прокси для доступа в Интернет. Я добавлял http_proxy, https_proxy и no_proxy в образ докера. Вероятно, браузер в контейнере докеров пытался подключиться к серверу testcafe (работающему в том же контейнере) через прокси. (потому что он не использует 127.0.0.1/localhost?) Удаление настройки прокси-сервера пока работает, потому что мне не нужен доступ в Интернет в этом тесте. - person Kumar Gaurav; 09.12.2019
comment
Добавление 172.17.0.2 к no_proxy сработало для меня. Собираемся добавить 0,1,2,3,4,5,6,7,8,9 к no_proxy.. мы не будем ничего получать в Интернете через IP-адрес. - person Kumar Gaurav; 09.12.2019
comment
все еще получаю ту же ошибку, и я нажимаю не на локальный хост, а на полное доменное имя - person sjt003; 08.02.2020

Это из-за прокси. Мы используем прокси для доступа в Интернет. Я добавлял http_proxy, https_proxy и no_proxy(127.0.0.1) в образ докера. Браузер в контейнере докеров пытался подключиться к серверу testcafe (работающему в том же контейнере) через прокси-сервер, потому что он использует не 127.0.0.1/localhost, а 172.17.0.2 в качестве хоста сервера testcafe внутри контейнера. Таким образом, добавление 172.17.0.2 к no_proxy работает.

person Kumar Gaurav    schedule 08.02.2020