如何从docker中检测bash中的完全交互式shell?

Mat*_*att 7 bash docker

我想在"docker run"中检测-ti是否已传递给入口点脚本.

docker run --help for -t -i

-i, --interactive=false     Keep STDIN open even if not attached
-t, --tty=false             Allocate a pseudo-TTY
Run Code Online (Sandbox Code Playgroud)

我尝试了以下但是即使在本地测试(不在docker中)它也不起作用并且总是打印出"Not interactive".

#!/bin/bash

[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'
Run Code Online (Sandbox Code Playgroud)

Ewa*_*Ewa 5

entrypoint.sh:

#!/bin/bash

set -e

if [ -t 0 ] ; then
    echo "(interactive shell)"
else
    echo "(not interactive shell)"
fi
/bin/bash -c "$@"
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM debian:7.8

COPY entrypoint.sh /usr/bin/entrypoint.sh
RUN chmod 755 /usr/bin/entrypoint.sh
ENTRYPOINT ["/usr/bin/entrypoint.sh"]
CMD ["/bin/bash"]
Run Code Online (Sandbox Code Playgroud)

建立图像:

$ docker build -t is_interactive .
Run Code Online (Sandbox Code Playgroud)

交互式运行图像:

$ docker run -ti --rm is_interactive "/bin/bash"
(interactive shell)
root@dd7dd9bf3f4e:/$ echo something
something
root@dd7dd9bf3f4e:/$ echo $HOME
/root
root@dd7dd9bf3f4e:/$ exit
exit
Run Code Online (Sandbox Code Playgroud)

不以交互方式运行图像:

$ docker run --rm is_interactive "echo \$HOME"
(not interactive shell)
/root
$
Run Code Online (Sandbox Code Playgroud)

这个stackoverflow答案帮助我找到了[ -t 0 ]

  • 从我的测试中,这将告诉您是否已通过-t选项,但不会告诉您是否已通过-i。 (4认同)