Uvicorn 不会用 CTRL+C 退出

Uvicorn won't quit with CTRL+C

我有一个 Python FastAPI 应用程序正在使用 uvicorn。我把它打包在 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)

当我按 CTRL+C 终止应用程序时,没有任何反应。我总是不得不关闭终端才能让它停止。

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

我知道我可以 运行 处于分离模式的容器 (-d),但有时我想实时查看容器日志。

如何杀死 docker 图像和 uvicorn 进程并保持终端静止 运行ning?

您需要 运行 包含 --tty--interactice 的容器,以便转发您的键盘输入。

-t, --tty Allocate a pseudo-TTY
-i, --interactive Keep STDIN open even if not attached

docker run -ti myapp

此外,如果您有 entrypoint,您应该确保不使用 shell 语法。

The shell form prevents any CMD or run command line arguments from being used, but has the disadvantage that your ENTRYPOINT will be started as a subcommand of /bin/sh -c, which does not pass signals. This means that the executable will not be the container’s PID 1 - and will not receive Unix signals - so your executable will not receive a SIGTERM from docker stop .

ENTRYPOINT ["uvicorn"]
CMD ["app.py"]

附带说明一下,关闭终端通常不会停止容器。在执行 docker ps.

时,您应该仍会看到它 运行ning