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.json
scripts
とコマンド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
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
を実行しない場合のデフォルト)。
これは私にとって厄介な問題を解決しました。スクリプトには次の行がありました。
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