web-dev-qa-db-ja.com

grunt-Shellを使用してdocker runを呼び出すスクリプトを呼び出すときに、「入力デバイスはTTYではありません」を回避するにはどうすればよいですか?

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 $@

関連するpackage.jsonscriptsとコマンドtestは次のとおりです。

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

gruntを取得してdockerをTTYに満足させるにはどうすればよいですか? gruntの外で./run.sh npm testを実行するとうまくいきます:

$ ./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
26
Matthew Adams

Docker runコマンドから-tを削除します。

docker run $RUN_ENV_FILE -i --rm --user node -v "$PWD":/app -w /app yaktor/node:0.39.0 $@

-tは、ttyを設定せずにttyを設定するようにdockerに指示します。ttyがなく、コンテナに接続しようとすると動作しません(-dを実行しない場合のデフォルト)。

62
BMitch

これは私にとって厄介な問題を解決しました。スクリプトには次の行がありました。

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

直接実行すると、スクリプトは正常に実行され、メールには正しい出力が含まれます。ただし、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
5
docker_newbie