我怎样才能优雅地从附加的 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
的状态:
- 终端的光标消失。
- 单击终端 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.
说我 运行 这个 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
的状态:
- 终端的光标消失。
- 单击终端 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.