在本地机器上对使用 python 构建的 API 进行 Docker 化

Dockerizing an API built with python on local machine

我已经在我的本地计算机上克隆了使用 python 构建的 API 的存储库,我的目标是能够在本地发送请求和接收响应。

我不熟悉 python 但代码非常易读且易于理解,但是存储库包含一些依赖项和配置文件 Dockerise (我不熟悉 Docker还有容器)。

那么为了能够在本地与 API 进行交互,需要遵循哪些步骤?
以下是配置和要求存储库中的一些文件:

requirements.txt 文件:

fastapi==0.70.0
pytest==7.0.1
requests==2.27.1
uvicorn==0.15.0

Dockerfile 文件:

FROM tiangolo/uvicorn-gunicorn:python3.9
COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt
COPY ./app /app

我已经安装了 Python3 和 docker 那么下一步是什么?

调整Docker文件

假设所有代码都在 /app 目录中,您已经复制了所有代码并安装了应用程序所需的所有依赖项。

但是你缺少 - 至少(见免责声明) - Docker 文件中的一个基本行实际上是最重要的行,因为它是 CMD 命令告诉 Docker 容器启动时应该执行哪个命令/进程。

我不熟悉您正在使用的特定基础映像(使用 FROM 命令定义),但在谷歌搜索后我发现 this repo 建议以下行,这确实使对我来说很有意义,因为它启动了一个网络服务器:

# open port 80 on the container to make it accesable from the outside
EXPOSE 80
# line as described in repo to start the web server
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

这应该在容器启动时使用存储在 main.py 变量 app 中的应用程序在端口 80 上启动 Web 服务器。

构建和运行容器

添加后,您需要使用 docker build 命令构建映像。

docker build -t asmoun/my-container .

这将使用当前目录中的 Dockerfile 构建容器映像 asmoun/my-container,因此使用 .。因此,请确保在包含 Docker 文件的目录中执行该命令。这将需要一些时间,因为必须下载基础映像并且需要安装依赖项。

您现在有一个图像,您可以使用 docker run 命令 运行:

docker run --name my-fastapi-container -d -p 80:80 asmoun/my-container

这将在分离模式下使用图像 asmoun/my-container 启动名为 my-fastapi-container 的容器(-d 确保您的 TTY 未附加到容器的选项)并定义端口mapping,将主机上的80端口映射到容器上的80端口,我们之前在Docker文件(EXPOSE 80).

中已经暴露出来了

您现在应该会看到一些 ID 被打印到您的控制台上。这意味着容器已经启动。您可以使用 docker ps -a 检查它的状态,您应该看到它被标记为 running。如果是,您现在应该可以连接到 localhost:80。如果不是,请使用 docker logs my-fastapi-container 查看容器的日志,希望您能了解更多信息。

免责声明

请注意,这只是关于如何启动和 运行ning 一个简单的 FastAPI 容器的最小指南,但某些参数可能会因应用程序而异(例如名称main.py 可能是 server.py 或类似的东西)在这种情况下你需要调整一些参数但整个过程(1. 调整 Docker 文件,2. 构建容器,3 . 运行 容器)应该可以工作。也有可能你的应用程序期望容器中存在一些其他东西,这些东西需要在 Dockerfile 中定义,但我和你(大概)都不知道这一点,因为 Dockerfile 提供的似乎不完整。这只是一个尽力而为的答案。

我已尝试 link 所有相关资源和命令,因此您可以查看其中一些资源和命令的作用以及您可能感兴趣的选项/参数。