深入解析 tiangolo/uwsgi-nginx-flask-docker 项目的 Python 3.9 镜像构建
2025-07-10 04:18:01作者:平淮齐Percy
镜像概述
这个 Dockerfile 是用于构建基于 Python 3.9 的 Flask Web 应用容器镜像的核心文件,它继承自 tiangolo/uwsgi-nginx 基础镜像,提供了完整的 uWSGI + Nginx + Flask 运行环境。
基础镜像选择
该镜像使用了 tiangolo/uwsgi-nginx:python3.9
作为基础镜像,这个基础镜像已经预先配置好了:
- Python 3.9 环境
- uWSGI 应用服务器
- Nginx Web 服务器
- 两者之间的优化集成配置
关键构建步骤解析
1. 依赖安装
COPY requirements.txt /tmp/requirements.txt
RUN pip install --no-cache-dir -r /tmp/requirements.txt
这部分将项目依赖文件复制到容器中,并使用 pip 安装所有依赖项。--no-cache-dir
参数可以减小镜像体积。
2. 静态文件配置
ENV STATIC_URL /static
ENV STATIC_PATH /app/static
ENV STATIC_INDEX 0
这里配置了静态文件服务的相关参数:
STATIC_URL
: 静态文件在 Web 中的访问路径STATIC_PATH
: 静态文件在容器中的实际存储路径STATIC_INDEX
: 是否将根路径(/)重定向到静态首页
3. 应用代码部署
COPY ./app /app
WORKDIR /app
ENV PYTHONPATH=/app
将应用代码复制到容器的 /app
目录,并设置为工作目录。PYTHONPATH
环境变量的设置使得应用模块可以被全局导入,这对 Alembic 数据库迁移等场景特别有用。
4. 入口点配置
RUN mv /entrypoint.sh /uwsgi-nginx-entrypoint.sh
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
这里进行了复杂的入口点配置:
- 将基础镜像的入口点脚本重命名保存
- 复制自定义入口点脚本
- 设置执行权限
- 指定容器启动时执行的入口点
自定义入口点脚本会在容器启动时生成 Nginx 的额外配置。
5. 启动命令
CMD ["/start.sh"]
最终使用基础镜像提供的 /start.sh
脚本来启动服务,这个脚本会:
- 检查并执行
/app/prestart.sh
(如果有,常用于数据库迁移等初始化操作) - 启动进程管理器
- 进程管理器会同时管理 Nginx 和 uWSGI 进程
技术亮点
- 静态文件优化处理:Nginx 直接处理静态文件请求,不经过 uWSGI,大幅提高性能
- 灵活的配置:通过环境变量可以轻松调整静态文件服务行为
- 模块化设计:入口点脚本的分层设计允许在继承时灵活扩展功能
- 完善的初始化流程:支持通过 prestart.sh 进行应用初始化
使用建议
- 在项目根目录创建
requirements.txt
文件列出所有依赖 - 将 Flask 应用代码放在
./app
目录下 - 如需数据库迁移等初始化操作,可以创建
/app/prestart.sh
脚本 - 静态文件应放置在
/app/static
目录下
这个镜像设计非常适合生产环境部署 Flask 应用,提供了开箱即用的高性能 Web 服务解决方案。