Docker 退出代码 0 问题

Docker exit code 0 issue

这是我尝试 docker 化 fastapi 脚本后的日志:

$ docker-compose logs -f
Attaching to docker-name
docker-name exited with code 0

这是我的 docker 撰写文件:

version: '3'  

services:
  observatory-service:
    build: ./observatory  
    volumes:
      - ./observatory:/usr/src/app 
    ports:
      - 8000:8000  

docker 文件:

FROM python:3.9

COPY requirements.txt /usr/src/app/
RUN pip install -r /usr/src/app/requirements.txt

COPY . /usr/src/app

CMD ["python", "/usr/src/app/api.py"]

api.py:

from fastapi import FastAPI
app = FastAPI()

@app.get("/")
def read_root():
    return { "Lux app": "Welcome to Lux app" }

@app.post("/extract_text")
def ali():
    return {"Hello": "World"}

我确定它会通过 api.py 但它会毫无错误地退出。我是 运行 这个 Windows docker.

问题是您直接使用 python 调用 fastAPI 服务器脚本,而不是用 Uvicorn 等 ASGI 网络服务器包装。 debugging page of fastAPI.

中对此进行了解释

我用 fastapi/uvicorn 的最新版本进行了测试,它工作得很好。我建议您进行以下两项更改:

1 - 将此行添加到您的 requirements.txt 文件中:

uvicorn

2- 然后将第一行和最后两行添加到 api.py 文件的末尾:

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return { "Lux app": "Welcome to Lux app" }

@app.post("/extract_text")
def ali():
    return {"Hello": "World"}


if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

GET /

的结果
{"Lux app":"Welcome to Lux app"}

最后,另一种选择是 following the docker guide provided by fastAPI,它通过直接使用 uvicorn 调用您的 fastapi 模块轻松解决​​了这个问题。这将实现与上述相同。

Dockerfile 示例:

FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]