Docker运行python项目:使用Docker成功启动FastAPI应用
根据昨天成功使用阿里云镜像加速后,我是根据windows本地的python项目,直接传到了centos,然后再导入到docker里面,然后进行运行,主要是发现运行的时候,老是提示一些库的问题,还有就是一些python老版本里面有一些库没有,然后装了最新的镜像,还有就是,每次运行项目时,都建议把一次性把需要更新的库更新到requirements.txt 
问题背景
在部署FastAPI应用到Docker容器时,遇到了容器启动后立即退出的问题。经过多次尝试,发现主要原因是Python依赖模块缺失和容器配置不当。
完整解决步骤
1. 准备项目文件结构
text
houtai6/ ├── Dockerfile ├── requirements.txt ├── Test1.py ├── static/ └── templates/
2. 创建完整的requirements.txt
bash
cat > requirements.txt <<EOF fastapi>=0.68.0 uvicorn>=0.15.0 pymysql>=1.0.2 pandas>=1.3.0 python-dateutil>=2.8.2 numpy>=1.21.0 apscheduler>=3.8.1 python-multipart>=0.0.5 Jinja2>=3.0.0 pytz>=2021.3 EOF
3. 优化Dockerfile配置
dockerfile
FROM python:3.8-slimWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpleCOPY . .CMD ["uvicorn", "Test1:app", "--host", "0.0.0.0", "--port", "8000"]
4. 构建和运行容器
bash
# 强制重建镜像 docker build --no-cache -t houtai6 .# 清理旧容器 docker rm -f houtai6_app 2>/dev/null# 运行新容器 docker run -d --name houtai6_app -p 8000:8000 houtai6
5. 验证服务状态
bash
# 检查容器状态 docker ps -a --filter "name=houtai6_app" --format "{{.Status}}"# 查看日志 docker logs -f houtai6_app
常见问题及解决方案
问题1:容器启动后立即退出
解决方案:
检查缺少的Python模块并添加到requirements.txt
确保FastAPI应用中有持续运行的进程
添加以下代码保持容器运行:
python
from threading import Event Event().wait() # 阻塞主线程
问题2:端口冲突
bash
# 检查端口占用 netstat -tulnp | grep 8000# 改用其他端口 docker run -d --name houtai6_app -p 8080:8000 houtai6
问题3:容器名称冲突
bash
# 删除已有容器 docker rm -f houtai6_app# 重新运行 docker run -d --name houtai6_app -p 8000:8000 houtai6
高级调试技巧
1. 进入容器内部调试
bash
docker exec -it houtai6_app /bin/bash# 容器内检查 pip list python -c "import pandas; print(pandas.__version__)"
2. 实时日志监控
bash
# 显示带时间戳的最后50行日志 docker logs -ft --tail 50 houtai6_app
3. 性能优化建议
dockerfile
# 使用多阶段构建减小镜像大小 FROM python:3.8-slim as builderWORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txtFROM python:3.8-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . .ENV PATH=/root/.local/bin:$PATH CMD ["uvicorn", "Test1:app", "--host", "0.0.0.0", "--port", "8000"]