web-dev-qa-db-fra.com

Comment contourner le problème "le périphérique d'entrée n'est pas un TTY" lors de l'utilisation de grunt-Shell pour appeler un script qui appelle docker run?

Lors de l'émission grunt Shell:test, Je reçois un avertissement "le périphérique d’entrée n’est pas un téléscripteur" et ne souhaite pas avoir à utiliser -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.

Ici se trouve le Gruntfile.js commande:

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

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

Voici le pertinent package.jsonscripts avec la commande test:

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

Comment obtenir grunt pour rendre docker heureux avec un téléscripteur? Exécution ./run.sh npm test en dehors de grunt fonctionne bien:

$ ./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

Retirer le -t à partir de la commande d'exécution du menu fixe:

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

Le -t indique à docker de configurer le terminal, ce qui ne fonctionnera pas si vous n’avez pas de terminal et n’attachez pas le conteneur (valeur par défaut lorsque vous ne faites pas de script -d).

62
BMitch

Cela a résolu un problème agaçant pour moi. Le script avait ces lignes:

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

Le script fonctionnerait parfaitement s'il était exécuté directement et le courrier venait avec le bon résultat. Cependant, lorsqu’il est exécuté à partir de cron, (crontab -e) le courrier viendrait sans contenu. Essayé beaucoup de choses autour des autorisations et des coquillages et des chemins, etc. Cependant pas de joie!

Enfin trouvé ceci:

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

Et sur ce cron.log fichier a trouvé cette sortie:

le périphérique d'entrée n'est pas un téléscripteur

La recherche m'a conduit ici. Et après avoir enlevé le -t, ça marche très bien maintenant!

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