#docker #makefile #cypress
#docker #makefile #cypress
Вопрос:
Корень моего проекта приложения содержит мои docker-compose и Makefile, а также папку с именем apps. В приложениях есть api и интерфейс. Моя установка Cypress находится в папке интерфейса.
Я хотел бы иметь возможность запускать команду cy.exec('make reset-fixtures')
из Cypress. Это возвращает ошибку «Нет правила для создания целевых настроек сброса», которая, как я полагал, может быть вызвана тем, что я выполняю из папки, которая находится глубже в дереве, чем мой Makefile. Итак, я изменил свою команду cy.exec('cd ../.. amp;amp; make reset-fixtures')
, которая привела к следующему:
Stderr:
the input device is not a TTY
make[1]: *** [reset-fixtures] Error 1
Каков наилучший способ выполнить эти команды make из Cypress?
РЕДАКТИРОВАТЬ: это команда make:
reset-fixtures:
@docker-compose exec mongodb /scripts/reset-fixtures.sh
Комментарии:
1. Эта ошибка не выводится make. Он печатается любой командой, которая выполняется в рецепте для целевого
reset-fixtures
объекта . Поскольку вы не показали это правило или команду, которая печатается перед этой ошибкой, мы не можем сказать об этом больше, кроме того, что, по-видимому, ожидается, что stdin будет терминалом, а это не так.2. Это рецепт создания:
reset-fixtures: @docker-compose exec mongodb /scripts/reset-fixtures.sh
3. Пожалуйста, отредактируйте свой вопрос, а не добавляйте комментарии: комментарии не могут быть правильно отформатированы. Вы вызываете
make
сами по себе или предоставляете другие аргументы, в частности-j
? Похоже, что для одной из вызываемых операций требуется, чтобы stdin был TTY . Если вы вызываете командуdocker-compose exec mongodb /scripts/reset-fixtures.sh </dev/null
для получения stdin/dev/null
вместо терминала, работает ли она или вы получаете ту же ошибку устройства ввода?4. Похоже, это та же ошибка устройства ввода. Я не использую -j, что это делает?
5.
-j
обновляет цели (которые не зависят друг от друга) параллельно. Поскольку одновременно выполняется несколько рецептов, только один из них (по сути, случайным образом) получит стандартный идентификатор, а остальные — нет. Однако, насколько мне известно, при последовательном запуске (без-j
) GNU make выдает каждой команде, которую она вызывает, тот же stdin, который она получила. Так что я не уверен, в чем здесь проблема. Если вы напишете правилоcheck_tty: ; test -t 0 amp;amp; echo is a tty
, а затем запуститеmake check_tty
, оно говоритis a tty
? Если это так, то, похоже, это не проблема make, по крайней мере, напрямую.
Ответ №1:
Что сработало для меня, так это использование -T
опции с docker-compos exec. Это предотвращает использование TTY:
-T, --no-TTY docker compose exec Disable pseudo-TTY allocation. By default docker compose exec allocates a TTY.
Это сделало бы его похожим на следующее:
тест cypress
cy.exec('(cd ../; make your_command)')
Makefile
your_command:
docker-compose exec -T your_container path_to_executable