-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDockerfile
More file actions
47 lines (34 loc) · 1.91 KB
/
Copy pathDockerfile
File metadata and controls
47 lines (34 loc) · 1.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# ---------- 阶段 1: 构建依赖 ----------
# 用 slim 基础镜像减小体积,安装编译工具用于可能需要源码编译的 C 扩展(asyncmy 等)
FROM python:3.14-slim AS builder
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc g++ default-libmysqlclient-dev pkg-config \
&& rm -rf /var/lib/apt/lists/*
# 引入 uv 做依赖管理,比 pip 更快且严格按 lockfile 安装
# 固定版本保证构建可复现,避免 latest 升级破坏 uv sync 行为
COPY --from=ghcr.io/astral-sh/uv:0.5.4 /uv /usr/local/bin/uv
WORKDIR /app
# 先拷贝依赖描述文件,利用 Docker 层缓存:只有依赖变更时才重新安装
COPY pyproject.toml uv.lock ./
# --frozen 严格按 uv.lock 安装,--no-dev 不安装开发依赖
RUN uv sync --frozen --no-dev
# ---------- 阶段 2: 运行时 ----------
# 运行时镜像不含编译工具,体积更小,攻击面更窄
FROM python:3.14-slim
# asyncmy 运行时只需 MySQL 客户端运行时库,不装 dev 头文件以减小镜像体积和攻击面
RUN apt-get update && apt-get install -y --no-install-recommends \
libmariadb3 \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# 从 builder 拷贝已装好依赖的虚拟环境
COPY --from=builder /app/.venv /app/.venv
ENV PATH="/app/.venv/bin:$PATH"
# 拷贝应用源码
COPY . .
EXPOSE 8000
# 健康检查:每 30s 探活一次,启动后给 30s 宽限期
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health', timeout=5).read()" || exit 1
# uvicorn 多 worker 提升并发;--timeout-graceful-shutdown 让 SSE 长连接优雅退出
# 生产可改用 gunicorn -k uvicorn.workers.UvicornWorker 获得更成熟的进程管理
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4", "--timeout-keep-alive", "120", "--timeout-graceful-shutdown", "30"]