在开发 FastAPI 应用时,我们有时希望将应用容器化,以便于部署和管理,同时避免污染本地的 Python 环境。使用 Docker 可以轻松实现这一目标,但如果你想在容器中安装依赖并进行调试,如何在不破坏本地环境的情况下管理依赖呢?本文将介绍如何通过 Docker 将 FastAPI 应用容器化,并展示如何进入容器安装依赖。
1. 项目结构
假设你已经有一个简单的 FastAPI 项目结构,主要包含以下文件:
Dockerfile
— 定义如何构建应用容器。docker-compose.yml
— 通过 Docker Compose 管理和启动容器。main.py
— FastAPI 应用代码。
2. Dockerfile
首先,我们需要一个 Dockerfile
来构建我们的容器。下面是一个简洁的 Dockerfile
,它基于官方的 Python 镜像,安装 FastAPI 和 Uvicorn,并暴露端口 8000 以供访问:
# 使用官方的 Python 镜像
FROM python:3.11-slim# 设置工作目录
WORKDIR /app# 安装 FastAPI 和 Uvicorn(作为 ASGI 服务器)
RUN pip install --no-cache-dir fastapi uvicorn# 将本地代码挂载到容器内的 /app 目录
VOLUME ["/app"]# 暴露端口 8000,FastAPI 默认使用这个端口
EXPOSE 8000# 启动容器时默认运行 Uvicorn
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
在这个 Dockerfile
中:
- 我们从
python:3.11-slim
镜像开始。 - 设置工作目录
/app
。 - 安装 FastAPI 和 Uvicorn(FastAPI 使用的 ASGI 服务器)。
- 将本地代码目录挂载到容器中的
/app
。 - 最后,通过
CMD
指定容器启动时默认运行 Uvicorn 以启动 FastAPI 应用。
3. Docker Compose 配置
接下来,我们创建一个 docker-compose.yml
文件来管理容器的启动。我们使用 stdin_open: true
和 tty: true
选项,使得我们可以进入容器内部并进行交互操作。
version: "3.8"services:fastapi-app:build: .ports:- "8000:8000"volumes:- .:/app # 将当前目录挂载到容器的 /app 目录environment:- PYTHONUNBUFFERED=1# 使用交互式终端来启动容器,这样你就可以进入容器stdin_open: truetty: true
在 docker-compose.yml
中:
- 我们使用
build: .
指定 Docker Compose 使用当前目录下的Dockerfile
来构建镜像。 ports
选项将容器的 8000 端口暴露到主机的 8000 端口,允许我们访问 FastAPI 服务。volumes
选项将本地的代码目录挂载到容器中,这样你就可以在不重启容器的情况下直接编辑代码。
4. 启动容器
现在,我们可以通过以下命令来构建并启动容器:
docker-compose up --build
这个命令会启动 FastAPI 服务,并监听在 localhost:8000
上,你可以在浏览器中访问:
http://localhost:8000
5. 进入容器并安装依赖
如果你需要安装新的依赖或进行调试,可以通过以下命令进入容器的终端:
docker-compose exec fastapi-app bash
进入容器后,你可以像在本地环境中一样使用 pip
安装依赖:
pip install <package_name>
例如,安装 requests
库:
pip install requests
6. 重启服务
如果你在容器中安装了新的依赖,记得重新启动 FastAPI 服务,以便它加载新的依赖:
docker-compose restart fastapi-app
7. 总结
通过以上步骤,我们成功将 FastAPI 应用容器化,并配置 Docker 和 Docker Compose 来管理和运行应用。更重要的是,我们通过交互模式进入容器并安装任何需要的依赖,从而避免污染本地的 Python 环境。这种方法非常适合开发阶段,尤其是在调试和安装依赖时非常方便。
相关命令汇总
-
构建并启动容器:
docker-compose up --build
-
进入容器的终端:
docker-compose exec fastapi-app bash
-
安装依赖:
pip install <依赖包名>
-
重启容器:
docker-compose restart fastapi-app
希望这篇博客对你有所帮助!如果你有任何问题或改进建议,欢迎在评论区留言讨论。