docker部署python应用需构建含代码、依赖和环境的可移植镜像,核心是编写分层缓存、非root用户、固定依赖版本、环境变量管理配置、stdout日志及本地验证的dockerfile。

用 Docker 部署 Python 应用,核心是把代码、依赖和运行环境打包成可移植的镜像,避免“在我机器上能跑”的问题。关键在于写好 Dockerfile、管理好依赖、合理设置启动命令,并注意构建与运行时的环境差异。
写一个简洁可靠的 Dockerfile
从官方 Python 基础镜像出发,推荐使用带版本号的 slim 镜像(如 python:3.11-slim),兼顾轻量与兼容性。结构建议如下:
- 用
COPY requirements.txt .+pip install -r requirements.txt分层安装依赖,利用 Docker 缓存加速后续构建 - 再
COPY . .复制源码,避免因代码变动导致 pip 安装层重复执行 - 指定非 root 用户运行(
useradd -m app && chown -R app:app /app),提升安全性 - 用
WORKDIR /app设定工作目录,CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]启动服务(根据实际框架调整)
正确处理依赖和配置
requirements.txt 必须固定所有依赖版本(用 pip freeze > requirements.txt 或 pip-compile 生成),否则镜像在不同时间构建可能引入不兼容更新。
敏感配置(如数据库密码、密钥)不要硬编码或写进镜像。推荐方式:
立即学习“Python免费学习笔记(深入)”;
- 运行时通过环境变量传入(
docker run -e DATABASE_URL=...),代码中用os.getenv()读取 - 用
.env文件配合docker-compose.yml的env_file字段加载(仅限开发/测试) - 生产环境建议结合 Secret 管理工具(如 Docker Swarm Secrets 或 Kubernetes Secrets)
本地验证与日志调试
构建后别急着上线,先本地运行并检查基础行为:
- 执行
docker build -t my-python-app .构建镜像 - 运行
docker run -p 8000:8000 --rm my-python-app,访问http://localhost:8000确认服务响应 - 加
-it参数进入容器:docker run -it --rm my-python-app sh,手动检查文件路径、Python 版本、包是否安装成功 - 日志输出保持到 stdout/stderr(不要重定向到文件),方便
docker logs查看实时输出
生产部署小建议
单机部署可用 docker-compose 管理多容器协作(如加 Nginx 反向代理、Redis 缓存);集群场景建议迁移到 Kubernetes。
- 镜像打标签区分环境,例如
my-python-app:prod-v1.2,避免用latest - 在
docker-compose.yml中设置restart: unless-stopped,保证异常退出后自动恢复 - 限制资源防止失控:用
mem_limit: "512m"和cpus: "1.0"控制容器资源占用 - 健康检查加上:
healthcheck: {test: ["CMD", "curl", "-f", "http://localhost:8000/health"], interval: 30s}
不复杂但容易忽略:每次修改代码后记得重新构建镜像,别直接改运行中的容器文件;Python 的 __pycache__ 和 .pyc 文件可加 .dockerignore 排除,减小镜像体积。










