使用带有独角兽的工厂模式的 fastAPI 应用程序的 Dockerfile

Dockerfile for a fastAPI app using Factory pattern with unicorn

我正在使用 fastAPI 和 unicorn 为全栈应用程序构建后端服务。

src/asgi.py

import uvicorn
from src import create_app

app = create_app()

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", log_level="info", reload=True)

src/init.py

from fastapi import FastAPI
from src.api.v1.auth import auth_router
from src.core.config import *


def create_app() -> FastAPI:
    root_app = FastAPI()
    root_app.include_router(
        auth_router,
        prefix="/api/v1",
        tags=["auth"],
    )
    return root_app

Dockerfile

FROM python:3.9

RUN mkdir /app
WORKDIR /app

RUN apt update && \
    apt install -y postgresql-client

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

我是如何构建的运行:

docker build -t travian-back:v1 . 
travian-back:v1 uvicorn asgi:app

完全没有错误,服务器已启动 http://127.0.0.1:8000
现在我尝试直接将 uvicorn asgi:app 命令添加到我的 Dockerfile。原因是因为我要在最后使用docker-compose,这样会更容易。这就是我现在拥有的:

Dockerfile

    RUN mkdir /app
    WORKDIR /app
    
    RUN apt update && \
        apt install -y postgresql-client
    
    COPY requirements.txt ./
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY . .

CMD ["uvicorn", "asgi:app"]

现在我没有做 travian-front:v1 uvicorn asgi:app 我正在做 travian-back:v1 uvicorn asgi:app ,我在构建和 运行 我的 docker 图像时没有错误但是无法访问服务器在 http://127.0.0.1:8000

问题是您没有 运行 asgi 文件作为主文件,因为您使用 uvicorn 指向它。所以它没有监听 0.0.0.0 或更好的说法,所有这些选项都被忽略了。

要么直接调用 asgi 文件,我不推荐这样做,要么删除 asgi 文件并使用带有 --factory 标志的 uvicorn 并将其指向您的应用程序工厂。

ENTRYPOINT ["uvicorn", "src.init:create_app", "--factory", "--host 0.0.0.0"]

我在这里使用入口点,这样您就可以在 运行 上传递额外的标志,例如日志级别,而无需覆盖它。

docker run -p 8000:8000 myapp --log-level warning

就是说,我对你的文件名有点困惑 init.py。你是说 __init__.py 吗?如果是这样我就不会把工厂放在这个文件中,__init__.py 不应该像这样使用。将其放在名为 main.py 或类似名称的文件中。