Uvicorn 不会用 CTRL+C 退出

Jed*_*Jed 6 sigterm docker uvicorn

我有一个使用 uvicorn 的 Python FastAPI 应用程序。我把它打包在 docker 容器中。当我使用如下命令运行应用程序(在 Windows 10 计算机上的 Power Shell 中)时:docker run -p 8080:8080 my-image-name我收到以下 uvicorn 启动文本:

INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
Run Code Online (Sandbox Code Playgroud)

当我按CTRL+C杀死该应用程序时,什么也没有发生。我总是最终不得不关闭终端才能让它停止。

这是因为它在 docker 容器中运行吗?

我知道我可以在分离模式 ( ) 下运行容器-d,但有时我想在容器日志发生时观察它们。

如何终止 docker 映像和 uvicorn 进程并保持终端仍在运行?

The*_*ool 9

--tty您需要使用和运行容器,--interactice以便转发您的键盘按下操作。

\n
\n

-t, --tty 分配伪 TTY
\ni, --interactive 即使未附加,也保持 STDIN 打开

\n
\n
docker run -ti myapp\n
Run Code Online (Sandbox Code Playgroud)\n

此外,您应该确保您的入口点不使用 shell 语法(如果有的话)。

\n
\n

shell 形式阻止使用任何 CMD 或运行命令行参数,但缺点是您的 ENTRYPOINT 将作为 /bin/sh -c 的子命令启动,它不传递信号。这意味着可执行文件不会是container\xe2\x80\x99s PID 1 - 并且不会接收Unix信号 - 因此你的可执行文件不会从 docker stop 接收 SIGTERM 。

\n
\n
ENTRYPOINT ["uvicorn"]\nCMD ["app.py"]\n
Run Code Online (Sandbox Code Playgroud)\n

顺便说一句,关闭终端通常不会停止容器。在执行 时,您应该仍然会看到它正在运行docker ps

\n

  • 这看起来很有希望,但对我来说,即使使用“-it”表示“podman run”,使用 JSON 数组形式表示“ENTRYPOINT”,“uvicorn”也不会通过 Ctrl+C 退出。 (2认同)