有以下代码:
import docker
client = docker.from_env()
container = client.containers.create("ubuntu", stdin_open=True)
container.start()
container.stop()
选项
stdin_open
必须设置为 True
. stop
操作需要 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 秒超时。
关于python - Docker.py 如何使用 stdin_open=True 停止容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61506752/