我怎样才能优雅地从附加的 Docker 容器终止中恢复?

How can I gracefully recover from an attached Docker container terminating?

说我 运行 这个 Docker 命令在一个终端 window:

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

在它退出之前,我 运行 在第二个终端 window:

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

我会在第二个容器中成功看到htop运行ning,显示bash休眠进程运行ning。到目前为止一切顺利。

5 秒后,第一个容器将退出,代码为 0。一切顺利。

此时,第二个容器将退出,代码为 137 (SIGILL)。这对我来说也很有意义,因为第二个容器只是连接到第一个容器。

问题是这会扰乱 macOS Terminal.app 的状态:

  1. 终端的光标消失。
  2. 单击终端 window 会导致输入鼠标位置字符。

我希望找到一种方法来避免搞乱 Terminal.app 状态。有什么建议吗?

你无法避免这种行为,因为在终止后设置终端状态是 htop 的职责,但是当用 SIGKILL 终止时它不能这样做。但是,您可以使用 reset 命令自行修复此终端 window,该命令旨在初始化终端状态。

关于 "attached" 容器:

--pid=container:<name> 选项意味着新容器将 运行 在第一个容器的 PID 命名空间中,正如 pid_namespaces(7) man page 所说:

If the "init" process of a PID namespace terminates, the kernel terminates all of the processes in the namespace via a SIGKILL signal.