使用带有独角兽的工厂模式的 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 或类似名称的文件中。
我正在使用 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 或类似名称的文件中。