使用诗歌和 gunicorn 构建一个 dockerized FastAPI 应用程序。
先决条件 Python3 码头工人 docker-compose 设置 FastAPI 应用程序 为什么使用 Poetry 进行依赖和虚拟环境管理而不是 pip 及其等效的 python 设置 许多开发人员喜欢 Yarn 和 Npm 在 NodeJS 生态系统中提供的体验。 Poetry 为 Python 世界的开发人员提供了类似的体验。 本教程将 npm 用于依赖管理的方法与诗歌进行比较,以展示
先决条件
-
Python3
-
码头工人
-
docker-compose
设置 FastAPI 应用程序
为什么使用 Poetry 进行依赖和虚拟环境管理而不是 pip 及其等效的 python 设置
许多开发人员喜欢 Yarn 和 Npm 在 NodeJS 生态系统中提供的体验。 Poetry 为 Python 世界的开发人员提供了类似的体验。
本教程将 npm 用于依赖管理的方法与诗歌进行比较,以展示它的一些最大优势以及为什么应该使用它。
与 NodeJS 世界中的package.json
文件类似,poetry 使用一个名为pyproject.toml
文件的文件来指定项目的配置,并自动生成一个锁定文件来描述整个依赖树。
pyproject.toml
文件如下所示;
在你的机器上设置诗歌
在您的系统中安装 python 后,您可以轻松运行
pip install poetry
对于python3
pip3 install poetry
可以通过以下方式确认安装成功
poetry --version
应用依赖和虚拟环境
安装了诗歌后,我们可以通过简单地运行以下命令来启动一个 python 应用程序
poetry init
并按照命令行提示进行操作。该命令类似于 NodeJS 生态系统中的npm init -y
。
应该创建一个pyproject.toml
文件,您可以在其中添加依赖项(您将在项目期间使用的库)。
使用以下命令激活虚拟环境
poetry shell
最后一步是添加启动 FastAPI 应用程序的依赖项。
使用诗歌添加核心依赖项只需使用poetry add [package name
即可,而添加开发依赖项则需要--dev
标志。
要开始开发我们的应用程序,我们需要 fastapi 和 unicorn 作为依赖项。
poetry add fastapi uvicorn[standard] gunicorn
用uvicorn启动应用服务器
首先,我们需要创建一个名为main.py的新 python 文件,该文件将包含我们的路由以及负责实例化 FastAPI 应用程序的 app 对象。
最后,我们可以使用如下所示的命令启动应用程序;
uvicorn main:app --reload
现在您的应用程序在http://127.0.0.1:8000上运行,好消息是:FastAPI 与 Swagger 集成,文档是自动生成的,您可以通过http://127.0.0.1 检查它: 8000/文档
Dockerize FastAPI 应用程序
创建 docker 容器的第一步是指定应用程序需要运行什么、如何以及在哪个操作系统上运行,所有这些配置都驻留在名为Dockerfile
的文件中。
FROM python:3.10 as python-base
RUN mkdir python_tutorial
WORKDIR /python_tutorial
COPY /pyproject.toml /python_tutorial
RUN pip3 install poetry
RUN poetry config virtualenvs.create false
RUN poetry install
COPY . .
CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "main:app", "--bind", "0.0.0.0:8000"]
让我们逐行跟踪文件:
第 1 行:表示基本映像(在我们的例子中是 python),我指定了 3.10 版本,您可以相应地更改它(例如 3.9、3.7、..etc)
第 2 行:让我们在容器中创建一个名为 python_tutorial 的文件夹
第 3 行:直接将创建的目录设置为我们的工作目录。(因此,下面的所有命令都将作为我们的根目录执行 w.r.t python_tutorial)
第 4 行:将包含需求的文件复制到应用程序目录。仅复制安装应用程序依赖项所需的文件,而不是直接复制应用程序中的其余文件。由于这个文件不经常更改,Docker 会检测到它并在这一步使用缓存,也为下一步启用缓存。
第 5 行:我们安装了诗歌,所以它可以用于我们的应用容器中的依赖管理
第 6 行:我们禁用容器内的虚拟环境创建,因为它仅在本地机器上需要
第 7 行:我们在容器中安装所有必需的库。
第 8 行:复制所有文件。由于这包含所有更改最频繁的代码,因此 Docker 缓存不会轻易用于此或任何后续步骤。所以,重要的是把它放在 Dockerfile 的末尾,以优化容器镜像的构建时间。
第 9 行:公开我们的应用程序以使用 gunicorn 启动应用程序。将worker设置为4,并将应用端口绑定到8000
咳咳!!!粉丝自! 我知道这是很多事实,所以让我们休息一下。😅
我们目录的当前结构如下所示;
为了优雅地管理我们的应用程序 docker 镜像,我们决定使用 docker-compose。使用 docker-compose,我们可以使用单个命令在同一主机上配置和启动连接到我们的应用程序的多个 Docker 容器,嘿!看起来很酷🫣
现在,让我们配置 docker-compose.yml
version: "3"
services:
api:
build: .
image: python_tutorial
ports:
- "8000:8000"
volumes:
- .:/python_tutorial:ro
让我们看一下文件中发生了什么;
第 1 行:指定 docker-compose 的版本。
第 3 行:我们设置了一个名为 api 的服务。
第 4 → 5 行:分别指定 Docker 文件的路径和标签名称。
第 6 行:指定端口映射:
第 7 行:设置绑定挂载,以允许对应用程序进行进一步更改(开发 - 生产中不需要)
第 8 行:指定 env 文件(如果存在)
最后运行以下命令;
docker-compose up
如果您今天过得愉快,您将在终端上获得以下结果。
截图 2022-08-31 at 00.09.30.png
更多推荐
所有评论(0)