使用Docker来启动fastapi项目:
# 第一阶段:安装必要的软件
FROM python:3.12-slim as BASEENV DEBIAN_FRONTEND=noninteractive \PYTHONUNBUFFERED=1 \PIP_DEFAULT_TIMEOUT=100 \UV_SYSTEM_PYTHON=1# Install system packages
RUN set -eux; \python -c 'a="deb.debian.org";b="mirrors.aliyun.com";f="/etc/apt/sources.list.d/debian.sources";from pathlib import Path;p=Path(f);s=p.read_text();ss=s.replace(a,b);p.write_text(ss)' && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo 'Asia/Shanghai' >/etc/timezone && \apt-get update && \apt-get install -y --no-install-recommends \build-essential \curl \pkg-config \libssl-dev \postgresql-client \libpq-dev \&& \apt-get clean && \rm -rf /var/lib/apt/lists/*# 第二阶段:安装Python依赖库
FROM base AS dependenciesWORKDIR /app# Install uv - Method 1: Copy the binary from its official image
# ghcr.io是github的官方镜像仓库,速度很慢,采用nju大学镜像源加速
# #COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
COPY --from=ghcr.nju.edu.cn/astral-sh/uv:latest /uv /uvx /bin/# 如果nju的也慢,可以注释掉上面那行,改用pip安装:
# Install uv - Method 2: Install by pip
#RUN pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple && \
# pip install pip-conf-mirror -i https://mirrors.aliyun.com/pypi/simple && \
# pip-conf-mirror --pip qinghua && pip install uv && pip-conf-mirror --uv qinghua# 复制项目依赖文件(优先复制依赖文件,利用 Docker 缓存)
COPY pyproject.toml uv.lock* ./# Install CPU pytorch
#RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
# Install GPU pytorch
#RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130# 使用 uv 安装项目依赖(直接安装到系统 Python 环境,不创建虚拟环境)
RUN uv pip install -i https://mirrors.aliyun.com/pypi/simple -r pyproject.toml && uv cache clean# 第三阶段:复制应用程序代码
FROM dependencies AS sourceWORKDIR /appCOPY . .# 第四阶段:生产环境镜像
FROM source AS releaseENV STAGE="production"
EXPOSE 8000CMD ["sh", "-c", "STAGE=$STAGE uvicorn main:app --host 0.0.0.0 --port 8000"]
Refs:
https://betterstack.com/community/guides/scaling-docker/docker-build-best-practices/
https://www.cnblogs.com/coreylin/p/17349146.html