如何在使用 g运行t-shell 调用调用 docker 运行 的脚本时解决 "the input device is not a TTY"?
How to workaround "the input device is not a TTY" when using grunt-shell to invoke a script that calls docker run?
发出 grunt shell:test
时,我收到警告 "the input device is not a 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
> yaktor@0.59.2-pre.0 test /app
> mocha --color=true -R spec test/*.test.js && npm run lint
[snip]
105 passing (3s)
> yaktor@0.59.2-pre.0 lint /app
> standard --verbose
从 docker 运行 命令中删除 -t
:
docker run $RUN_ENV_FILE -i --rm --user node -v "$PWD":/app -w /app yaktor/node:0.39.0 $@
-t
告诉 docker 配置 tty,如果您没有 tty 并尝试附加到容器(默认情况下没有),这将不起作用-d
).
这解决了我的一个恼人问题。该脚本有这些行:
docker exec **-it** $( docker ps | grep mysql | cut -d' ' -f1) mysql --user= ..... > /var/tmp/temp.file
mutt -s "File is here" someone@somewhere.com < /var/tmp/temp.file
如果直接 运行 脚本会 运行 很好,并且邮件会带有正确的输出。然而,当 运行 来自 cron
,(crontab -e
) 时,邮件将没有任何内容。围绕权限、shell 和路径等尝试了很多东西。但是没有快乐!
终于找到这个:
*/20 * * * * scriptblah.sh > $HOME/cron.log 2>&1
然后在那个 cron.log
文件上找到这个输出:
the input device is not a TTY
搜索将我带到这里。在我删除 -t
之后,它现在运行良好!
docker exec **-i** $( docker ps | grep mysql | cut -d' ' -f1) mysql --user= ..... > /var/tmp/temp.file
发出 grunt shell:test
时,我收到警告 "the input device is not a 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
> yaktor@0.59.2-pre.0 test /app
> mocha --color=true -R spec test/*.test.js && npm run lint
[snip]
105 passing (3s)
> yaktor@0.59.2-pre.0 lint /app
> standard --verbose
从 docker 运行 命令中删除 -t
:
docker run $RUN_ENV_FILE -i --rm --user node -v "$PWD":/app -w /app yaktor/node:0.39.0 $@
-t
告诉 docker 配置 tty,如果您没有 tty 并尝试附加到容器(默认情况下没有),这将不起作用-d
).
这解决了我的一个恼人问题。该脚本有这些行:
docker exec **-it** $( docker ps | grep mysql | cut -d' ' -f1) mysql --user= ..... > /var/tmp/temp.file
mutt -s "File is here" someone@somewhere.com < /var/tmp/temp.file
如果直接 运行 脚本会 运行 很好,并且邮件会带有正确的输出。然而,当 运行 来自 cron
,(crontab -e
) 时,邮件将没有任何内容。围绕权限、shell 和路径等尝试了很多东西。但是没有快乐!
终于找到这个:
*/20 * * * * scriptblah.sh > $HOME/cron.log 2>&1
然后在那个 cron.log
文件上找到这个输出:
the input device is not a TTY
搜索将我带到这里。在我删除 -t
之后,它现在运行良好!
docker exec **-i** $( docker ps | grep mysql | cut -d' ' -f1) mysql --user= ..... > /var/tmp/temp.file