Docker.py 如何停止带有 stdin_open=True 的容器?

Docker.py how to stop a container with the stdin_open=True?

有如下代码:

import docker
client = docker.from_env()
container = client.containers.create("ubuntu", stdin_open=True)
container.start()
container.stop()

选项 stdin_open 必须设置为 Truestop 操作需要 10 秒来执行(它首先发送 SIGTERM,如果失败则在 10 秒后发送 SIGKILL)。所以看起来 SIGTERM 被忽略了。如何优雅地停止容器 stdin_open 设置为 True?

这是因为 PID 1 与 systemd 不同,并且不能像您期望的那样处理 SIGTERM/SIGINT。一般情况下,一个进程以PID > 1运行,PID 1处理系统信号。容器没有 systemd 运行 作为 PID 1,而是你的入口点。现在其他东西已经接管(入口点)并且是 PID 1,它们有责任处理系统信号。它必须被编程为明确地这样做。

您在 docs 中有关于此的警告。

一个解决方案是使用像 tini 这样的东西作为有效的 PID 1 进程。具体来说,在您的情况下处理 SIGINT/SIGTERM,SIGKILL 不需要 10 秒超时。