我如何从连接的Docker容器中正常恢复?

假设我在一个terminal窗口中运行这个Docker命令:

$ docker run --name stackoverflow --rm ubuntu /bin/bash -c "sleep 5" 

在退出之前,我在第二个terminal窗口中运行这个:

 $ docker run -it --rm --pid=container:stackoverflow terencewestphal/htop 

我将成功地看到htop在第二个容器中运行,显示正在运行的bash睡眠进程。 到现在为止还挺好。

5秒后,第一个容器将以代码0退出。 都好。

此时,第二个容器将以代码137 (SIGILL)退出。 这对我来说也是有意义的,因为第二个容器只是附在第一个容器上。

问题是,这弄乱了macOS的Terminal.app的状态:

  1. terminal的光标消失。
  2. 单击“terminal”窗口会将鼠标位置字符input为input。

Docker SIGILL

我希望find一种方法来避免搞乱Terminal.app状态。 有什么build议么?

你不能避免这样的行为,因为在终止之后设置terminal状态是htop责任,但是在用SIGKILL终止时不能这样做。 但是,您可以使用reset命令自行修复此terminal窗口,该命令用于初始化terminal状态。

关于“附加”容器:

--pid=container:<name>选项意味着新容器将在第一个容器的PID名称空间中运行,并且由于pid_namespaces(7)手册页说:

如果PID命名空间的“init”进程终止,则内核通过SIGKILL信号终止命名空间中的所有进程。