概述
在这篇文章中,我简要介绍了 FastAPI 项目的 docker 化以及如何将其上传到 Docker Hub。 这里概述的概念在我最近出版的一本书“使用 FastAPI 和 AWS 构建无服务器 Python 应用程序”中得到了扩展。 事不宜迟,让我们开始吧!
定义图像
安装依赖项
我们将使用 Python 3.9-slim 基础镜像来帮助我们定义和安装 uvicorn、wheel、poetry 以及其他一些依赖项。 创建一个 Dockerfile 并添加以下内容:
FROM python:3.9.12-slimRUN pip install fastapi uvicorn poetry wheelEXPOSE 8000WORKDIR /usr/src/projectnameENV PORT 8000ENV HOST "0.0.0.0"
在这里,您可以更改端口以及正确配置应用程序可能需要的任何其他内容。
复制项目文件
下一部分将在一些假设下运行。 首先,它假定除了 main.py 和依赖文件之外的所有内容都位于 repo 中名为 src 的文件夹下。 假设您的应用程序的端口和主机是从环境变量中提取的,而不是需要通过启动命令传递。 它还假设最终用户正在利用诗歌来实现他们的依赖。
无论哪种方式,您基本上都需要复制运行应用程序所需的最少文件,以避免添加额外的脚本、测试文件夹等。将以下内容添加到 Dockerfile:
COPY ./src/ /projectname/srcCOPY ./main.py /projectnameCOPY ./pyproject.toml /projectnameWORKDIR /projectname
现在我们只需要安装项目依赖项并添加入口点。 将以下内容添加到您的文件中:
RUN poetry config virtualenvs.create false \ && poetry installCMD ["uvicorn", "main:app"]
查看 Dockerfile
您的最终 Dockerfile 应该类似于以下内容,在端口和项目文件列表中给出或更改:
FROM python:3.9.12-slimRUN pip install fastapi uvicorn poetry wheel virtualenvEXPOSE 8000WORKDIR /usr/src/projectnameENV PORT 8000ENV HOST "0.0.0.0"COPY ./src/ /projectname/srcCOPY ./main.py /projectnameCOPY ./pyproject.toml /projectnameWORKDIR /projectnameRUN poetry config virtualenvs.create false \ && poetry installCMD ["uvicorn", "main:app"]
如果您使用 requirements.txt 文件,您可能需要使用poetryfor pip 替换依赖项安装。 别忘了也复制过来!
构建和测试
建造
要在本地构建,请使用项目所需的图像名称运行以下命令:
docker build -t imagename -f Dockerfile .
如果您的机器使用 Apple Silicon 芯片运行,请运行以下命令以防止出现 AWS Fargate 和 Heroku(仅举几例)问题:
docker build --platform linux/amd64 -t imagename -f Dockerfile .
通过运行 docker images 命令检查生成的项目。 确认清单后,我们可以继续下一步。
本地运行
我们将尝试启动初始项目。 如果您的应用程序需要环境变量,则在您将构建配置为拥有它之前,它不会准备好使用,但您将能够知道整体设置是否接近下一步工作。
从终端运行以下命令:
docker run --name imagename -p 8000:8000 imagename
除非您传入在后台运行的选项,否则您将看到终端的输出。 当您单击容器时,您还可以从 Docker 仪表板查看日志。 假设您在端口 8000 上运行并且没有对项目启动进行进一步更改,您的输出应该类似于以下内容:
上传到 Docker Hub
对于这一部分,您需要拥有一个 Docker 帐户。 完成此操作后,单击选项以创建新存储库并为其命名。
对于此示例,您可以选择私有或公共。 请注意,您可以在练习后将其删除。 单击创建以获取最终的存储库和图像名称。 您可以更改在构建中标记图像的方式以包含存储库名称,如下所示:
docker build -t repositoryname/imagename -f Dockerfile .
设置好新标记的映像后,验证到您的 DockerHub 帐户并使用以下命令推送您的映像(将存储库、映像和标记替换为您的条目,例如,viratecinteractive/bookapi:latest):
docker push repositoryname/imagename:tag
完成后,您将看到新上传的内容以及一些可供您使用的其他详细信息和选项,例如漏洞扫描。
而已! 这只是使用 Docker Hub 作为我们的注册表的一个简短示例,但您可以应用讨论的大部分步骤来上传到 AWS ECR 和 Heroku 容器注册表。
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除