如何从docker检测bash中的完全交互shell?
我想在“docker run”中检测是否已将-ti传递给入口点脚本 docker run--为-t-i提供帮助如何从docker检测bash中的完全交互shell?,bash,docker,Bash,Docker,我想在“docker run”中检测是否已将-ti传递给入口点脚本 docker run--为-t-i提供帮助 -i, --interactive=false Keep STDIN open even if not attached -t, --tty=false Allocate a pseudo-TTY 我尝试过以下方法,但即使在本地测试(不是docker内部测试)也不起作用,并且总是打印出“非交互式” entrypoint.sh: #!/bin/bash
-i, --interactive=false Keep STDIN open even if not attached
-t, --tty=false Allocate a pseudo-TTY
我尝试过以下方法,但即使在本地测试(不是docker内部测试)也不起作用,并且总是打印出“非交互式”
entrypoint.sh:
#!/bin/bash
set -e
if [ -t 0 ] ; then
echo "(interactive shell)"
else
echo "(not interactive shell)"
fi
/bin/bash -c "$@"
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"]
建立形象:
$ docker build -t is_interactive .
以交互方式运行图像:
$ docker run -ti --rm is_interactive "/bin/bash"
(interactive shell)
root@dd7dd9bf3f4e:/$ echo something
something
root@dd7dd9bf3f4e:/$ echo $HOME
/root
root@dd7dd9bf3f4e:/$ exit
exit
$ docker run --rm is_interactive "echo \$HOME"
(not interactive shell)
/root
$
以非交互方式运行图像:
$ docker run -ti --rm is_interactive "/bin/bash"
(interactive shell)
root@dd7dd9bf3f4e:/$ echo something
something
root@dd7dd9bf3f4e:/$ echo $HOME
/root
root@dd7dd9bf3f4e:/$ exit
exit
$ docker run --rm is_interactive "echo \$HOME"
(not interactive shell)
/root
$
这帮助我找到了
[-t0]
如果你只需要它echo$-
你得到了什么?另外,您正在运行哪个版本的bash?奇怪的是,这应该可以工作。我认为-t可以。作为脚本运行的脚本(/path/to/script
或bash/path/to/script
)不是以交互模式运行的。在shell提示符下运行该命令或将其源代码(/path/to/script
),它将按照您期望的方式工作。谢谢。没有关系。我发现我可以用test-t选项检测tty。我不知道-I是否被指定,但-t至少会告诉我是否存在tty,如果失败,我可以指示重新运行-t不确定为什么要进行向下投票,但我已经澄清,我想在入口点脚本中检测到这一点。通过测试,这将告诉您是否通过了-t
选项,但是不能告诉您是否通过了-i
。您还需要[-t1]
来检测交互模式。docker运行中的--tty
选项只是告诉docker分配一个tty,但并不意味着您得到一个shell。因此,为了完整性,您需要类似于[[-t0&&-t1]]
的东西来确保即使映像使用tty运行,但传递了--detach
选项,您仍然可以检测到这是一个非交互式会话,并执行适当的操作