python项目打包为镜像

1.生成 requirements.txt

在项目根目录下,使用 pipreqs生成依赖文件,确保镜像构建时安装正确的包

复制代码
pip install pipreqs
pipreqs . --encoding=utf8 --force

2.编写 Dockerfile

复制代码
# 使用官方 Python 轻量级镜像
FROM python:3.11-slim

# 设置容器内工作目录
WORKDIR /app

# 复制依赖文件并安装依赖(利用Docker缓存层)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
#RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口(FastAPI服务运行的端口,仅作声明,运行时需用-p映射)
EXPOSE 8000

# 启动命令(用uvicorn启动服务,host=0.0.0.0允许容器外部访问)
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

3. (可选)添加 .dockerignore 文件

避免将本地虚拟环境、缓存文件等打入镜像,减小镜像体积

(1)在Dockerfile 所在的同一目录下 ,创建一个名为 .dockerignore的文件

复制代码
touch .dockerignore

(2)使用文本编辑器打开 .dockerignore文件,根据你的项目类型添加需要忽略的条目。一个典型的 Python FastAPI 项目可以这样配置

复制代码
# 忽略版本控制目录
.git/

# 忽略Python编译缓存和虚拟环境
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
venv/
env/
.venv/

# 忽略IDE配置文件
.vscode/
.idea/
*.swp
*.swo

# 忽略日志文件
*.log
logs/

# 忽略环境变量文件(通常包含敏感信息)
.env
.env.production

# 忽略README等本地文档(除非需要打包进镜像)
README.md

4. 编写Dockerfile文件构建镜像与运行容器

直接拷贝整个目录到容器内定义的工作目录

启动FastAPI服务(关键:指向agent_chat_demo01下的主文件,假设主文件是agent_chat_demo01/app/app.main.py)

CMD ["uvicorn", "agent_chat_demo01.app.main:app", "--host", "0.0.0.0", "--port", "8000"]

复制代码
# 1. 选择轻量且稳定的Python基础镜像(推荐3.11+,兼容大部分依赖)
FROM python:3.11-slim

# 2. 设置容器内的工作目录(后续所有操作都在/app下)
WORKDIR /app

# 3. 设置Python环境变量:避免生成pyc文件、日志实时输出(方便调试)
ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1

# 4. (可选)安装系统依赖(如果你的app依赖gcc、libpq等,取消注释)
# RUN apt-get update && apt-get install -y --no-install-recommends \
#     gcc \
#     && rm -rf /var/lib/apt/lists/*

# 5. 复制项目的依赖文件到容器工作目录(先复制requirements.txt,利用Docker缓存)
COPY agent_chat_demo01/requirements.txt .

# 6. 安装Python依赖(--no-cache-dir避免缓存,减小镜像体积)
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 7. 复制整个agent_chat_demo01目录到容器的/app目录下(保留顶层目录,保证导入路径正确)
COPY agent_chat_demo01/ ./agent_chat_demo01/

# 8. 暴露FastAPI服务端口(默认8000,若你代码里用其他端口,改成对应值)
EXPOSE 8000

# 9. 启动FastAPI服务(关键:指向agent_chat_demo01下的主文件,假设主文件是agent_chat_demo01/app/app.main.py)
# 若你的主文件不是main.py(比如是app.py),改成对应名称,如"agent_chat_demo01.app:app"
CMD ["uvicorn", "agent_chat_demo01.app.main:app", "--host", "0.0.0.0", "--port", "8000"]

docker build -t my-fastapi-app .

5.启动服务

复制代码
version: '3.8'  # 指定 Compose 文件的版本

services:
  # 定义一个名为 fastapi-app 的服务
  fastapi-app:
    build: .  # 使用当前目录下的 Dockerfile 构建镜像
    container_name: my-fastapi-container  # 指定容器名,相当于 --name
    ports:
      - "8000:8000"  # 端口映射,相当于 -p 8000:8000
    # 设置环境变量,例如指定生产环境,也可使用 environment 文件
    environment:
      - ENV=production
    # 卷挂载,用于开发时代码热重载:将宿主机代码目录挂载到容器内
    # volumes:
    #   - ./app:/app
    # 配置重启策略,避免容器意外退出
    restart: unless-stopped

6.配置文件映射

相关推荐
Ashley_Amanda2 小时前
Python 进阶:从熟练到精通的核心技能体系
开发语言·python
秋刀鱼程序编程2 小时前
Java编程基础入门(四)---选择循环语句
java·开发语言·算法
不会飞的鲨鱼2 小时前
腾讯语音识别 一句话识别python接口
人工智能·python·语音识别
一条咸鱼_SaltyFish2 小时前
WebFlux vs MVC:Gateway集成若依框架的技术选型之争
java·开发语言·微服务·gateway·mvc·开源软件·webflux
充值修改昵称2 小时前
数据结构基础:二叉树高效数据结构的奥秘
数据结构·python·算法
独自归家的兔2 小时前
Java反射之根:Class类生成机制深度剖析与最佳实践
java·开发语言
2501_944526422 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 笑话生成器实现
android·javascript·python·flutter·游戏
程序媛徐师姐2 小时前
Python基于人脸识别的社区签到系统【附源码、文档说明】
python·人脸识别·python人脸识别·python社区签到系统·python人脸识别社区签到·人脸识别社区签到系统·社区签到系统
悟能不能悟2 小时前
Gson bean getxxx,怎么才能返回给前端
java·前端