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
我有一个 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
.