Docker:input密码后ssh挂起

我的问题是几乎完全一样的以下链接 ,除了我的SSH服务器在docker集装箱。

我的Dockerfile非常简单。

FROM ubuntu:12.04 ENV DEBIAN_FRONTEND noninteractive RUN apt-get update RUN apt-get install -y openssh-server less nano RUN mkdir /var/run/sshd RUN adduser chrome RUN echo "chrome:chrome" | chpasswd RUN echo "root:chrome" | chpasswd EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"] 

当我尝试SSHlogin,它永远挂起启动壳。

 $ ssh -p2222 chrome@localhost /bin/bash --noprofile --norc # trying to login with ssh chrome@localhost's password: <-------------hangs forever 

如果我在ssh上使用-t参数,我可以login。 我不知道为什么。

运行像ls这样的程序没有问题。 也许有人可以复制这个容器,并找出问题所在?

这与docker无关,当你ssh到远程主机时,你可以得到同样的结果。

这个问题的一个线索是在ssh手册页

-t强制伪tty分配。 这可以用来在远程机器上执行任意屏幕程序,这在实现菜单服务时非常有用。 多个-t选项强制tty分配,即使ssh没有本地tty。

所以,如果你提供一个远程命令来运行,ssh不会使用tty分配,除非你使用-t开关。 由于bash是交互式的,它需要一个tty。

以下将不会挂起

 $ ssh -p2222 chrome@localhost /bin/bash -i --noprofile --norc 

bash的-i选项是获得交互式 shell所必需的。


从Bash参考手册1.2什么是shell? 部分:

壳可以以交互方式或非交互方式使用。 在交互模式下,他们接受从键盘input的input。 当以非交互方式执行时,shell会执行从文件读取的命令。

和6.3.1什么是交互式Shell? :

交互式shell是一个启动时没有非选项参数,除非指定了-s,没有指定-c选项,并且其input和错误输出都连接到terminal(由isatty(3)确定),或者以-i选项。

交互式shell通常从用户的terminal读取和写入。

当您使用docker run启动容器时,您必须指定-it作为交互式terminal,其原因与上面所述完全相同。

作为您的dockerfile一个观察,您可以将--net=host添加到您的--net=host docker run命令中,以便在不希望显式使用EXPOSE 22 ,容器可以访问本机NICconfiguration。

此外,(听起来很愚蠢,我知道)我已经有问题在dockerlogin,即使在一个本地容器, 似乎挂起,但如果我只是按<enter>我然后得到提示…