Python服务如何构建docker镜像

1. 准备Python应用

首先确保你的应用有基本的项目结构:

my-python-app/
├── app.py          # 主程序
├── requirements.txt # 依赖包
└── Dockerfile      # Docker配置文件

2. 编写Dockerfile

# 使用官方Python基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口(如果应用需要)
EXPOSE 5000

# 设置环境变量
ENV PYTHONUNBUFFERED=1

# 运行应用
CMD ["python", "app.py"]

3. 准备依赖文件

requirements.txt 示例:

flask==2.3.0
requests==2.31.0
numpy==1.24.3

4. 示例应用 (app.py)

# Flask示例应用
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from Docker!"

@app.route('/health')
def health():
    return "OK", 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

5. 构建Docker镜像

# 构建镜像
docker build -t my-python-app .

# 指定版本号
docker build -t my-python-app:v1.0 .

# 构建时不使用缓存
docker build --no-cache -t my-python-app .

6. 运行容器

# 运行容器
docker run -d -p 5000:5000 --name my-app my-python-app

# 交互式运行(用于调试)
docker run -it --rm my-python-app /bin/bash

# 带环境变量运行
docker run -d -p 5000:5000 -e ENV=production my-python-app

7. 优化建议

多阶段构建(减小镜像体积)

# 构建阶段
FROM python:3.9-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

# 运行阶段
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]

使用.dockerignore文件
创建 .dockerignore:

__pycache__
*.pyc
*.pyo
*.pyd
.git
.env
venv/
*.md
.gitignore

8. 高级配置示例

生产环境Dockerfile

FROM python:3.9-slim

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    gcc \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# 复制并安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 创建非root用户
RUN useradd -m -u 1000 appuser
COPY . .
RUN chown -R appuser:appuser /app
USER appuser

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:5000/health')"

EXPOSE 5000
CMD ["python", "app.py"]

9. 常用命令总结

# 查看本地镜像
docker images

# 查看运行中的容器
docker ps

# 查看容器日志
docker logs my-app

# 停止容器
docker stop my-app

# 删除容器
docker rm my-app

# 删除镜像
docker rmi my-python-app

# 保存镜像为文件
docker save -o my-app.tar my-python-app

# 从文件加载镜像
docker load -i my-app.tar

10. 发布到镜像仓库

# 标记镜像
docker tag my-python-app username/my-python-app:latest

# 推送到Docker Hub
docker push username/my-python-app:latest

# 推送到私有仓库
docker tag my-python-app myregistry.com/my-python-app:latest
docker push myregistry.com/my-python-app:latest

注意事项

  • 不要以root用户运行应用 - 使用非特权用户

  • 使用特定版本的基础镜像 - 避免使用:latest

  • 分层构建 - 将不常变更的层放在前面

  • 清理缓存 - 使用--no-cache-dir减少镜像体积

  • 添加健康检查 - 便于容器编排

posted @ 2026-05-14 11:05  空指针的救赎  阅读(19)  评论(0)    收藏  举报