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