如何在后台 运行 Docker 应用程序而不是输出到终端

How to run Docker app in background instead of output to terminal

我 运行 在 shell 中使用 unicorn 使用 FastAPI。但是当我 运行 它在 docker 里面时,它仍然将输出输出到 shell 而不是像这样的 Docker :

INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:5000 (Press CTRL+C to quit)

如何让应用程序将其输出输出到后台包含的 shell 和 运行 容器作为普通 Docker 容器?

代码如下:

from typing import Optional
import uvicorn
from fastapi import FastAPI
    

app = FastAPI()
    

@app.get("/")
def read_root():
    return {"Hello": "World"}
    
    
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}
    
    
if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=5000, log_level="info")

这是 Docker 文件:

FROM python:3.9.3-buster
WORKDIR /opt
ADD . .
RUN pip install "poetry==1.1.5"
RUN python -m venv /venv
RUN poetry export -f requirements.txt | /venv/bin/pip install -r /dev/stdin
RUN chmod u+x main.py
CMD ["/venv/bin/python", "main.py", "--port", "5000"]

我 运行 并像这样构建 Docker 图像:

docker build -t example00 .
docker run -p 5000:5000 example00

有人有什么建议吗?

你需要使用-d标志

docker run -d -p 5000:5000 example00

来自docker run --help

Options:
  -d, --detach                         Run container in background and print container ID

因此,您可以选择 docker run -d -p 5000:5000 example00。要检查您的容器是否正常启动,您可以使用 -d 标志和 运行:

返回的容器 ID
docker logs -f <container-ID>

并希望看到您的日志(-f 标志表示 Follow log output):

    INFO:     Started server process [1]
    INFO:     Waiting for application startup.
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://127.0.0.1:5000 (Press CTRL+C to quit)

在这种情况下,您的 CTRL+C 不会停止 FastAPI 服务器,只会取消 docker logs -f 命令。如果要停止 运行ning 容器,请改用 docker stop <container-ID>