Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从docker检测bash中的完全交互shell?_Bash_Docker - Fatal编程技术网

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

如何从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

我想在“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

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
选项,您仍然可以检测到这是一个非交互式会话,并执行适当的操作