Как обход "устройство ввода не является TTY" при использовании grunt-shell для вызова script, который вызывает запуск докеров?

При выпуске grunt shell:test я получаю предупреждение "устройство ввода не является TTY" и не хочет использовать -f:

$ grunt shell:test
Running "shell:test" (shell) task
the input device is not a TTY
Warning: Command failed: /bin/sh -c ./run.sh npm test
the input device is not a TTY
 Use --force to continue.

Aborted due to warnings.

Здесь команда Gruntfile.js:

shell: {
  test: {
    command: './run.sh npm test'
  }

Здесь run.sh:

#!/bin/sh
# should use the latest available image to validate, but not LATEST
if [ -f .env ]; then
  RUN_ENV_FILE='--env-file .env'
fi
docker run $RUN_ENV_FILE -it --rm --user node -v "$PWD":/app -w /app yaktor/node:0.39.0 [email protected]

Здесь соответствующий package.json scripts с командой test:

"scripts": {
  "test": "mocha --color=true -R spec test/*.test.js && npm run lint"
}

Как я могу получить grunt, чтобы сделать docker счастливым с TTY? Выполнение ./run.sh npm test вне работы grunt отлично:

$ ./run.sh npm test

> [email protected] test /app
> mocha --color=true -R spec test/*.test.js && npm run lint


[snip]

  105 passing (3s)


> [email protected] lint /app
> standard --verbose

Ответ 1

Удалите -t из команды запуска docker:

docker run $RUN_ENV_FILE -i --rm --user node -v "$PWD":/app -w /app yaktor/node:0.39.0 [email protected]

-t сообщает docker о настройке tty, которая не будет работать, если у вас нет tty и попробуйте подключиться к контейнеру (по умолчанию, когда вы не делаете -d).

Ответ 2

Это разрешило мне неприятную проблему. script имели следующие строки:

docker exec **-it**  $( docker ps | grep mysql | cut -d' ' -f1)  mysql --user= ..... > /var/tmp/temp.file
mutt -s "File is here" [email protected] < /var/tmp/temp.file

script будет работать отлично, если он будет запущен напрямую, и почта будет иметь правильный вывод. Однако при запуске от cron, (crontab -e) почта не будет содержать контент. Пробовал много вещей вокруг разрешений и оболочек и путей и т.д. Однако никакой радости!

Наконец, нашел это:

*/20 * * * * scriptblah.sh > $HOME/cron.log 2>&1

И в этом файле cron.log найден этот вывод:

устройство ввода не является TTY

Поиск привел меня сюда. И после того, как я удалил -t, теперь он отлично работает!

docker exec **-i**  $( docker ps | grep mysql | cut -d' ' -f1)  mysql --user= ..... > /var/tmp/temp.file