学有所记- 探索FastAPI在docker上的部署

目标:

学习怎样在docker中安装部署FastAPI,完成项目结构的搭建以及hello world的运行

 

背景:

公司内服务器资源有限,为了共享算力资源,同时又能隔离运行环境,因此采用了docker部署的方式,进行各种开发测试。网上虽然已有集成fastapi+uvicorn+gunicorn,自己动手,可以了解更多细节,以及更深度的定制,从而学习怎样自定义镜像文件以及启动docker。

 

实现过程:

1、安装docker(系统已默认安装,可参照网上教程,以后另外再补记)

2、安装python。选用了3.11版

3、安装pycharm 社区版。

4、建立项目文件夹

project:my_fastapi

====app (目录)

     ----main.py

     ----requirements.txt

====docker (目录)

    ----Dockerfile

    ----docker-compose.yaml

5、编辑 main.py

import os
import sys
from multiprocessing import freeze_supportimport uvicorn
from fastapi import FastAPI, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanagerupload_files_save_path = os.environ["UPLOAD_FILE"] if "UPLOAD_FILE" in os.environ else "/upload"@asynccontextmanager
async def lifespan(app: FastAPI):# 初始化阶段print('初始化成功..')yield# 清理阶段print('卸载成功..')app = FastAPI(root_path="/aiCentre", lifespan=lifespan)  # aicentre为nginx中api路由名
# 启用CORS支持
app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],  # 或者只列出 ["POST", "GET", "OPTIONS", ...] 等allow_headers=["*"],
)# 路由
@app.get("/")
async def read_root():return {"message": "Hello World!"}@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):file_location = f"files/{file.filename}"with open(file_location, "wb+") as file_object:file_object.write(await file.read())return {"info": f"file '{file.filename}' saved at '{file_location}'",}if __name__ == "__main__":freeze_support()uvicorn.run('main:app', host="0.0.0.0", port=8080, reload=True, workers=1)#current_dir = os.path.dirname(os.path.realpath(__file__))# 将项目根目录添加到 Python 路径中#sys.path.append(current_dir)# print(upload_files_save_path)

6、用pip freeze命令生成python库文件列表,用于移植。

 pip freeze > requirements.txt
annotated-types==0.7.0
anyio==4.9.0
click==8.1.8
colorama==0.4.6
fastapi==0.115.12
h11==0.14.0
idna==3.10
pydantic==2.11.1
pydantic_core==2.33.0
python-multipart==0.0.20
sniffio==1.3.1
starlette==0.46.1
typing-inspection==0.4.0
typing_extensions==4.13.0
uvicorn==0.34.0

7、编写 Dockerfile

# 建立 python3.11 环境
# FROM python:3.11FROM docker.1ms.run/python:3.11# 设置pip源为国内源
# COPY pip.conf /root/.pip/pip.conf# 镜像作者云无碍
LABEL maintainer="yunwuai <xxx@yyyy.zzzzz>"# 在容器内/var/www/html/下创建 mysite1文件夹
# RUN mkdir -p /var/www/html/mysite1
# 将当前目录文件加入到容器工作目录中(. 表示当前宿主机目录)
# ADD . /var/www/html/mysite1
RUN mkdir -p /app
RUN mkdir -p /uploadCOPY . /app
# 设置容器内工作目录
WORKDIR /app
# RUN echo $PWD
# 利用 pip 安装依赖
# 设置安装依赖包的镜像以及安装相关的依赖包,需要安装的依赖包以及版本提前在requirements.txt文件里写出来
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
RUN pip install -r /app/requirements.txt
# RUN pip3 install pandas numpy moviepy pydub matplotlib python-multipart uvicorn# 设置 python 环境变量
ENV PYTHON_ENV_TEST=/app# Run the start script, it will check for an /app/prestart.sh script (e.g. for migrations)
# And then will start Gunicorn with Uvicorn
# 声明运行时的端口
EXPOSE 8080# 运行Gunicorn服务器
# docker  build  -t  my_fastapi  .
CMD ["python","/app/main.py"]

  在app目录下运行

docker  build  -t my_fastapi:test -f ..\docker\Dockerfile . 

(最后有一个“.”号,这个很重要,代表当前目录,小白复制网上的代码时,很容易遗漏)

 或在项目目录下运行:

docker  build  -t my_fastapi:test -f docker\Dockerfile app

 

8、编写docker-compose.yaml

services:fastapi:image: my_fastapi:testports:- 8181:8080environment:ENV_PARAMS: test_paramMODEL_NAME: fastmodel

启动docker

docker-compose.exe -f docker\docker-compose.yaml up -d 

 

总结:

1、docker 运行时的端口镜像,前后顺序不要写错 是先宿主机再容器 即 -p 宿主机端口:容器内端口

2、docker build 时,最后一个参数为dockerfile中的“当前目录”,当出现文件无法复制或找不到文件时,一般都是当前路径设置有误.

3,启动docker-compose报错,很多时候是因为参数顺序搞错,把up -d放到 -f前面去了。up -d 一般在命令最后

4、fastAPI自带swagger功能,可以通过 http://127.0.0.1:8181/docs 和 http://127.0.0.1:8181/redoc进行访问和测试

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP keepalive 详解

一、简介 HTTP协议早期版本&#xff0c;比如1.0&#xff0c;默认是不使用持久连接的&#xff0c;也就是每个请求/响应之后都会关闭TCP连接。这样的话&#xff0c;每次请求都需要重新建立连接&#xff0c;增加了延迟和资源消耗。Keep-Alive的作用是保持连接&#xff0c;让多个请…

长短期记忆神经网络(LSTM)基础学习与实例:预测序列的未来

目录 1. 前言 2. LSTM的基本原理 2.1 LSTM基本结构 2.2 LSTM的计算过程 3. LSTM实例&#xff1a;预测序列的未来 3.1 数据准备 3.2 模型构建 3.3 模型训练 3.4 模型预测 3.5 完整程序预测序列的未来 4. 总结 1. 前言 在深度学习领域&#xff0c;循环神经网络&…

基于机器学习的三国时期诸葛亮北伐失败因素量化分析

一、研究背景与方法论 1.1 历史问题的数据化挑战 三国时期&#xff08;220-280年&#xff09;的战争史存在史料分散、数据缺失的特点。本研究通过构建包含军事、经济、地理、政治四大维度的结构化数据库&#xff0c;收录建安十二年&#xff08;207年&#xff09;至建兴十二年…

蓝桥杯省模拟赛 数位和

问题描述 只能被 1 和本身整除的数称为质数。 请问在 1 &#xff08;含&#xff09;到 1000000 &#xff08;含&#xff09;中&#xff0c;有多少个质数的各个数位上的数字之和为 23 。 提示&#xff1a;599 就是这样一个质数&#xff0c;各个数位上的数字之和为 59923 。 #…

Timer的底层实现原理?

Timer 是 Java 中用于定时任务调度的基础工具类,其底层实现基于 单线程+任务队列 的模型。以下是 Timer 的底层实现原理的详细分析: 一、核心组件 TimerThread 继承自 Thread,是 Timer 的工作线程,负责从队列中提取任务并执行。通过 while (true) 循环持续检查任务队列。Ta…

Java 枚举类 Key-Value 映射的几种实现方式及最佳实践

Java 枚举类 Key-Value 映射的几种实现方式及最佳实践 前言 在 Java 开发中&#xff0c;枚举(Enum)是一种特殊的类&#xff0c;它能够定义一组固定的常量。在实际应用中&#xff0c;我们经常需要为枚举常量添加额外的属性&#xff0c;并实现 key-value 的映射关系。本文将详细…

青少年编程与数学 02-015 大学数学知识点 01课题、概要

青少年编程与数学 02-015 大学数学知识点 01课题、概要 一、线性代数二、概率论与数理统计三、微积分四、优化理论五、离散数学六、数值分析七、信息论 《青少年编程与数学》课程要求&#xff0c;在高中毕业前&#xff0c;尽量完成大部分大学数学知识的学习。一般可以通过线上课…

智能打印预约系统:微信小程序+SSM框架实战项目

微信小程序打印室预约系统&#xff0c;采用SSM&#xff08;SpringSpringMVCMyBatis&#xff09;经典框架组合。 一、系统核心功能详解 1. 智能化管理后台 ​用户数据看板​打印店资源管理​预约动态监控​服务评价系统 2. 微信小程序端 ​智能定位服务​预约时段选择​文件…

DataX 3.0 实战案例

第五章 实战案例 5.1. 案例一 5.1.1. 案例介绍 MySQL数据库中有两张表&#xff1a;用户表(users)&#xff0c;订单表(orders)。其中用户表中存储的是所有的用户的信息&#xff0c;订单表中存储的是所有的订单的信息。表结构如下&#xff1a; 用户表 users: id&#xff1a;用…

设计模式学习(1)

面向对象设计原则 单一职责 每个类只有一个职责&#xff0c;并被完整的封装在类中&#xff0c;该原则用来控制类的粒度。 例如Mapper&#xff0c;controller都只负责一个业务。 开闭原则 应该对扩展开放&#xff0c;而对修改封闭&#xff0c;例如定义接口或是抽象类作为抽…

在 Rocky Linux 9.2 上编译安装 Redis 6.2.6

文章目录 在 Rocky Linux 9.2 上编译安装 Redis 6.2.6Redis 介绍官网Redis 的核心特性高性能支持多种数据结构多种持久化机制复制与高可用2.5 事务与 Lua 脚本消息队列功能 Redis 适用场景Redis 与其他数据库对比Redis 的优势与劣势Redis 优势Redis 劣势 部署过程系统环境信息环…

量子计算与经典计算的融合与未来

最近研学过程中发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击下方超链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面进入文章正…

数据结构(4)——带哨兵位循环双向链表

目录 前言 一、带哨兵的循环双向链表是什么 二、链表的实现 2.1规定结构体 2.2创建节点 2.3初始化 2.4打印 2.5检验是否为空 2.6销毁链表 2.7尾插 2.8尾删 2.9头插 2.10头删 2.11寻找特定节点 2.12任意位置插入&#xff08;pos前&#xff09; 2.13删除任意节点 …

Github 2025-03-30 php开源项目日报 Top10

根据Github Trendings的统计,今日(2025-03-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10TypeScript项目1Coolify: 开源自助云平台 创建周期:1112 天开发语言:PHP, Blade协议类型:Apache License 2.0Star数量:10527 个Fo…

3. 线程间共享数据

1. 线程共享数据会造成什么问题&#xff1f; 1.1 读写不一致 多线程读不会造成数据变动&#xff0c;所以没有问题。只要有一个线程设计修改数据&#xff0c;就会导致数据共享出现问题&#xff0c;简单的是数据不一致&#xff0c;严重的是程序访问已经释放的内存&#xff0c;造…

JAVA垃圾回收算法和判断垃圾的算法

一、判断垃圾的算法 判断对象是否为垃圾的核心是确定对象是否不再被使用。Java主要采用以下两种算法&#xff1a; 1. 引用计数法&#xff08;Reference Counting&#xff09; 原理&#xff1a;每个对象维护一个引用计数器&#xff0c;记录被引用的次数。当引用被添加时计数器…

界面架构 - MVVM (Qt)

MVVM MVVM 的主要特点示例示例功能示例代码ViewModel 类&#xff08;C&#xff09;主函数入口&#xff08;main.cpp&#xff09; QML 文件&#xff08;main.qml&#xff09;总结 MVVM&#xff08;Model-View-ViewModel&#xff09;架构是一种旨在进一步分离界面和业务逻辑的设计…

第十四届MathorCup高校数学建模挑战赛-C题:基于 LSTM-ARIMA 和整数规划的货量预测与人员排班模型

目录 摘要 一、 问题重述 1.1 背景知识 1.2 问题描述 二、 问题分析 2.1 对问题一的分析 2.2 对问题二的分析 2.3 对问题三的分析 2.4 对问题四的分析 三、 模型假设 四、 符号说明 五、 问题一模型的建立与求解 5.1 数据预处理 5.2 基于 LSTM 的日货量预测模型 5.3 日货量预测…

银河麒麟V10 aarch64架构安装mysql教程

国产操作系统 ky10.aarch64 因为是arm架构&#xff0c;故选择mysql8&#xff0c;推荐安装8.0.28版本 尝试8.0.30和8.0.41版本均未成功&#xff0c;原因不明☹️ 1. 准备工作 ⏬ 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 2. 清理历史环境 不用管…

C++多继承

可以用多个基类来派生一个类。 格式为&#xff1a; class 类名:类名1,…, 类名n { private: … &#xff1b; //私有成员说明; public: … &#xff1b; //公有成员说明; protected: … &#xff1b; //保护的成员说明; }; class D: public A, protected B, private C { …//派…