使用Docker构建Python FastAPI镜像的最佳实践

 更新时间:2026年02月03日 08:26:22   作者:展菲  
本文分享了优化Python FastAPI应用Docker部署的关键技巧:使用slim基础镜像减小体积,通过多阶段构建分离编译与运行环境,利用.dockerignore排除无关文件,推荐采用非root用户运行增强安全性,需要的朋友可以参考下

前言

用 Docker 部署 Python FastAPI 应用时,镜像过大会拖慢拉取和部署,依赖或权限不当又容易带来安全与可维护性问题。通过多阶段构建、精简基础镜像、非 root 运行等方式,可以在保证功能的前提下减小体积并提升安全性。

本文只讲 Dockerfile 的关键写法和注意点,不贴完整可运行项目。

基础 Dockerfile 示例

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
EXPOSE 8000

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

要点:

  • python:3.11-slim:相比默认 python:3.11 体积小很多,一般已够用;若依赖 C 库,再考虑 slimalpine 的取舍。
  • WORKDIR /app:后续 COPY、RUN 都在此目录,便于路径统一。
  • 先 COPY requirements.txt 再 COPY .:利用层缓存,依赖不变时不会重复 pip install
  • –no-cache-dir:不保留 pip 缓存,减小镜像体积。
  • CMD 用数组形式:避免通过 shell 解析,信号能正确传到 uvicorn。

多阶段构建减小体积

若构建阶段需要编译或额外工具,可用多阶段:第一阶段装依赖、编译,第二阶段只保留运行时需要的文件。

# 构建阶段(可选:需要编译时用)
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

# 运行阶段
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

这里把 pip install --user 的结果从 builder 拷到最终镜像,避免把构建工具、临时文件带进去。若依赖全是 wheel,也可以不用 builder,只在最终阶段装依赖。

.dockerignore 减少上下文与层

在项目根目录建 .dockerignore,避免把无关文件打进镜像、拉长构建时间:

__pycache__
*.pyc
.git
.venv
venv
.env
*.md
tests
.pytest_cache
.coverage
htmlcov

这样 COPY . . 不会包含上述内容,镜像更干净,构建更快。

非 root 运行(可选但推荐)

在 Dockerfile 中新建用户并用该用户运行进程,降低容器内权限风险:

FROM python:3.11-slim

RUN groupadd -r app && useradd -r -g app app

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY --chown=app:app . .

USER app
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

注意:若应用要写当前目录(如日志、上传),需保证 WORKDIRapp 可写;挂载卷时也要注意宿主目录权限。

环境变量与配置

敏感信息(如 DB 地址、密钥)不要写进镜像,运行时通过环境变量或挂载注入:

ENV PYTHONUNBUFFERED=1
# 不在这里写 DATABASE_URL、SECRET_KEY 等

docker rundocker-compose.yml 中传:

environment:
  - DATABASE_URL=postgresql://...
  - SECRET_KEY=...

应用内用 os.getenv('DATABASE_URL') 或 pydantic Settings 读取即可。

健康检查

在 Dockerfile 或 compose 中加健康检查,便于编排系统判断容器是否就绪:

HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \
  CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health')" || exit 1

前提是应用提供 /health 等轻量接口;若没有,可先用 curlwget 测根路径,或暂时去掉 HEALTHCHECK。

总结

  • 基础镜像选 slim,先 COPY requirements 再 COPY 代码,用 --no-cache-dir,CMD 用数组。
  • 需要时用多阶段构建和 .dockerignore 减小体积、加快构建。
  • 推荐非 root 用户运行,敏感配置用环境变量注入,按需加 HEALTHCHECK。

按上述方式构建的 FastAPI 镜像更小、更安全、更利于 CI/CD 与生产部署。

到此这篇关于使用Docker构建Python FastAPI镜像的最佳实践的文章就介绍到这了,更多相关Docker构建Python FastAPI镜像内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker安装部署neo4j的实战过程

    Docker安装部署neo4j的实战过程

    Docker是一种容器化技术,可以在Linux系统上部署应用程序,下面这篇文章主要给大家介绍了关于Docker安装部署neo4j的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • docker 使用GPU的过程详解

    docker 使用GPU的过程详解

    本文以TensorFlow2.0为例给大家介绍docker 使用GPU的过程详解,文中给大家介绍了基于拉的tf-gpu镜像构建自己的镜像的操作方法,启动镜像检查GPU是否可用的相关知识,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • Docker 架构简介

    Docker 架构简介

    这篇文章主要介绍了Docker 架构的相关资料,文中讲解非常细致,帮助大家开始学习docker,感兴趣的朋友可以了解下
    2020-07-07
  • docker 安装Consul的教程 (最新版2023)

    docker 安装Consul的教程 (最新版2023)

    ​consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务,内置了服务注册与 发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其 他工具,这篇文章主要介绍了最新版2023 docker 安装Consul,需要的朋友可以参考下
    2023-12-12
  • 利用docker搭建LAMP运行环境教程详解

    利用docker搭建LAMP运行环境教程详解

    LAMP相信对大家来说都不陌生, Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器,所以这篇文章给大家介绍利用docker快速搭建LAMP运行环境的方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • ubuntu如何完全干净的卸载docker

    ubuntu如何完全干净的卸载docker

    这篇文章主要介绍了ubuntu如何完全干净的卸载docker问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • docker创建私有镜像仓库搭建教程

    docker创建私有镜像仓库搭建教程

    本篇文章主要介绍了docker创建私有镜像仓库搭建教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Docker的镜像制作方法详解

    Docker的镜像制作方法详解

    这篇文章主要介绍了Docker的镜像制作方法的相关资料,文章讲解了Docker镜像的基本原理、结构和制作方式,镜像是创建Docker容器的基础,需要的朋友可以参考下
    2024-10-10
  • docker image tag为什么出现none的原因及解决

    docker image tag为什么出现none的原因及解决

    当我们使用docker加载新的镜像时,有时候会发现Repository和Tag名称都为none的情况,这通常是由于没有指定正确的标签名称或者仓库名称所导致的,本文主要介绍了docker image tag为什么出现none的原因及解决,感兴趣的可以了解一下
    2023-10-10
  • Docker容器迁移之导入和导出容器方式

    Docker容器迁移之导入和导出容器方式

    这篇文章主要介绍了Docker容器迁移之导入和导出容器方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论