news 2026/7/7 7:17:49

Docker部署Python FastAPI应用攻略:从构建镜像到第三方依赖缺失问题解决

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker部署Python FastAPI应用攻略:从构建镜像到第三方依赖缺失问题解决

目录

  • 前言
  • docker部署python fastapi
    • 基本概念
    • 生成requestment文件
    • Dockfile构建镜像
    • 启动容器
    • 容器启动失败时修复依赖缺失的解决方案,重构正确镜像

前言

  • 这篇博客讲一下如何在centos服务器上用docker部署 python应用,以及部署完成之后,发现由于缺第三方库,导致容器启动失败,无法进入容器手动安装第三方包的问题以及解决方案
  • 对docker不熟悉的朋友可以看下我的其他博客,有讲关于docker相关的知识以及多种问题的解决方案

docker部署python fastapi

基本概念

  1. Python 镜像与 Java SpringBoot 镜像的构建逻辑存在核心差异:Java 作为编译型语言,可将项目编译后的字节码文件,连同第三方依赖库的字节码文件一并打包为 JAR 包,基于该 JAR 包即可直接构建出可运行的应用镜像;而 Python 属于脚本型、解释型语言,无需编译环节,无法直接将第三方依赖库整合到项目文件中,因此在构建 Python 镜像时,需先将项目依赖的第三方库及其版本信息明确写入 requirements.txt 文件,再在镜像构建过程中通过 pip 命令将这些依赖安装到镜像内

生成requestment文件

requestment文件的内容是项目用到的第三方库以及版本信息,便于构建python应用镜像时,通过 pip 命令工具安装文件指定的第三方库到镜像内部,一个标准的requestment文件内容如下:

fastapi==0.124.4 langchain==0.3.14 langchain-community==0.3.14 langgraph==0.2.65 pydantic==2.12.5 python-dotenv==1.2.1 uvicorn==0.38.0 dashscope==1.21.0

一般在python项目根目录生成这个requestment文件,主要的生成方式有两种,

  1. 通过AI编码插件智能体自动构建,比如pycharm中可以安装通义灵码插件,直接在通义灵码插件面板选择智能体,让其生成项目的requestment文件。
  2. 第二种方式是通过python 第三方包,pipreqs工具生成,这个工具需要提前通过pip install pipreqs命令提前安装,最好安装在你的项目环境下
  3. 安装完成后,在控制台进入到你的项目根目录,执行pipreqs . --encoding=utf8 --force --ignore=".venv,venv,__pycache__",pipreqs工具会自动读取扫描当前目录及其子目录内的所有py文件,主要是读取文件的import内容,将第三方库以及版本信息创建写入到requestment.txt 文件中
  4. 值得注意的是,这两种方式无论哪一种,我都试过,生成的内容并不是很准确,存在版本冲突的问题,以及如果一个第三方库内部引用了另一个第三方库,间接引用的第三方库无法被正确写入requestment 文件内。这个问题的解决方案 在博客最后一个章节总结了解决方案。

Dockfile构建镜像

  1. 将项目根目录上传到服务器,在项目根目录中,创建Dockerfile镜像构建文件,编辑内容如下:

    # 使用官方Python 3.12的轻量级版本作为基础镜像FROM python:3.12-slim# 设置容器内的工作目录WORKDIR /app# 将依赖列表文件复制到工作目录COPY requirements.txt .# (可选但推荐)配置pip使用国内镜像源以加速本地构建RUN pip install--upgrade pip-i https://pypi.tuna.tsinghua.edu.cn/simple# 读取requirements.txt,安装第三方库到镜像内部RUN pip install-r requirements.txt-i https://pypi.tuna.tsinghua.edu.cn/simple# 将项目所有源代码复制到容器中 [4,10]COPY . .# 暴露FastAPI应用运行的端口(例如8000) [1,3]EXPOSE 8000# 设置容器启动命令 [1,4](@ref)CMD["uvicorn","main:app","--host","0.0.0.0","--port","8000"]
  2. 在构建镜像过程中docker会自动下载python:3.12-slim基础镜像,网速不好的朋友可以提前执行下面的命令,提前将python3.12基础镜像下载到服务器中。

    docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/python:3.12-slim docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/python:3.12-slim python:3.12-slim
  3. 最后在服务器,项目根目录即Dockerfile目录内执行docker build -t 镜像名称 .就构建好了你的python应用镜像

启动容器

  1. 执行docker run ,配置端口、网络、容器名等配置 启动容器

    docker run -d -p8000:8000 --name my-fastapi-container my-fastapi-app
  2. 我们 通过docker ps 命令 查看应用是否正常启动,很有可能你的python应用由于缺包导致启动失败,此时我们再通过docker logs -f 容器名 查看容器的启动日志,大概率会看到缺包导致启动失败的错误信息

容器启动失败时修复依赖缺失的解决方案,重构正确镜像

  1. 此时容器由于启动失败已经停止运行,此时我们无法通过docker exec -it 容器名 bash的方式进入容器,进而pip install 安装缺失的包,这是一个棘手的问题。

  2. 一个有效的解决方案是,不要以直接运行镜像中的python应用的方式启动容器,而是以启动命令行交互的方式启动容器,容器启动失败的核心是CMD/ENTRYPOINT执行的命令报错退出,我们可以覆盖启动命令,让容器以交互式 shell 运行(不执行原业务逻辑),从而进入容器安装缺失包

    # 注意,镜像还是之前的镜像,只是以命令行方式启动容器docker run -it --name temp-api 原先的镜像名 /bin/bash
  3. 启动后,安装缺失的包,并在容器内部的命令行中启动应用,测试是否可以正常运行,如果仍有缺失的包 ,继续安装,直到应用启动成功为止。

    # 1. 先升级pip(可选,加速安装)pipinstall--upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple# 2. 安装缺失的包(示例:假设缺requests、langchain-core)# 替换为你实际缺失的包名pipinstall缺失包名1 缺失包名2 -i https://pypi.tuna.tsinghua.edu.cn/simple# 3. 直接在容器内运行FastAPI应用(验证依赖是否修复)uvicorn main:app --host0.0.0.0 --port8008
  4. 安装包后运行正常,把容器的修改保存为新镜像,这个新的镜像就是你的python应用最终的完整镜像。

    # 先开新终端,查看临时容器IDdockerps# 提交修改(container_id替换为临时容器的ID,new-image:tag为新镜像名)docker commit 运行正常的容器名或者id 新的镜像名:tag# 用新镜像启动业务容器docker run -d -p8000:8000 --name my-fastapi-container my-fastapi-app
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 8:40:25

Delphi逆向工程深度解析:从原理到实战的完整指南

Delphi逆向工程深度解析:从原理到实战的完整指南 【免费下载链接】IDR Interactive Delphi Reconstructor 项目地址: https://gitcode.com/gh_mirrors/id/IDR 在软件开发和逆向工程领域,Delphi程序的反编译一直是个技术难题。当你面对丢失源代码的…

作者头像 李华
网站建设 2026/7/7 9:57:24

测试工程师的AI协作模式:从工具使用者到智能合作伙伴的演进

当测试遇上人工智能 在软件质量保障领域,测试工程师正站在技术变革的十字路口。根据Gartner最新研究报告,到2026年,超过80%的软件测试任务将由AI辅助完成,但这不意味着测试工程师将被取代,而是标志着一个全新的协作时…

作者头像 李华
网站建设 2026/7/7 19:40:21

质量成本的预测性分析

从成本控制到价值创造 在敏捷开发与持续交付成为主流的当下,软件测试已不再仅仅是缺陷检测环节,而是关乎产品商业价值的关键活动。质量成本(Cost of Quality, CoQ)分析为测试团队提供了量化工作价值的框架,而预测性分…

作者头像 李华
网站建设 2026/7/7 1:14:19

如何在电脑上轻松控制安卓设备:py-scrcpy-client 完整指南

如何在电脑上轻松控制安卓设备:py-scrcpy-client 完整指南 【免费下载链接】py-scrcpy-client 项目地址: https://gitcode.com/gh_mirrors/py/py-scrcpy-client 想要在电脑上实时查看和控制安卓设备吗?py-scrcpy-client 这个强大的 Python 工具可…

作者头像 李华
网站建设 2026/7/7 0:39:14

5、超越CardSpace的身份元系统:第三方与开源解决方案探索

超越CardSpace的身份元系统:第三方与开源解决方案探索 在当今数字化时代,用户身份管理是互联网安全与便捷性的关键。除了常见的身份管理方式,还有许多第三方和开源解决方案值得关注。本文将深入介绍这些非微软的身份管理方案,为你展现一个更加多元的身份管理世界。 主要组…

作者头像 李华
网站建设 2026/7/7 17:39:44

如何用SlopeCraft地图像素生成器打造专业级Minecraft艺术作品

如何用SlopeCraft地图像素生成器打造专业级Minecraft艺术作品 【免费下载链接】SlopeCraft Map Pixel Art Generator for Minecraft 项目地址: https://gitcode.com/gh_mirrors/sl/SlopeCraft 还在为Minecraft中制作像素画而烦恼吗?想要将喜欢的图片完美转化…

作者头像 李华