【问题标题】:How to run Docker app in background instead of output to terminal如何在后台运行 Docker 应用程序而不是输出到终端
【发布时间】:2021-04-05 17:24:13
【问题描述】:

我在 shell 中运行一个带有独角兽的 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")

这里是 Dockerfile:

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

有人有什么建议吗?

【问题讨论】:

    标签: docker uvicorn


    【解决方案1】:

    你需要使用-d标志

    docker run -d -p 5000:5000 example00
    

    【讨论】:

    • 谢谢!!我对你们俩都投了赞成票,但是因为与您的 123K 相比,Viktor 的声誉为 1... 我接受了他的回答 :P :P ;) 谢谢塔伦! :)
    • 不用担心,他的回答很详细,值得采纳。感谢您的支持:-)
    【解决方案2】:

    来自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 命令。如果要停止正在运行的容器,请改用docker stop &lt;container-ID&gt;

    【讨论】:

    • 感谢 Vitor 的回答!
    猜你喜欢
    • 2017-04-04
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2016-04-07
    • 2017-04-20
    • 2023-01-29
    • 2010-11-26
    相关资源
    最近更新 更多