FastAPI docker demo

何当共剪西窗烛 却话巴山夜雨时

使用Docker来启动fastapi项目:

# 第一阶段:安装必要的软件
FROM python:3.12-slim as BASE

ENV 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 dependencies

WORKDIR /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 source

WORKDIR /app

COPY . .

# 第四阶段:生产环境镜像
FROM source AS release

ENV STAGE="production"
EXPOSE 8000

CMD ["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

posted @ 2025-11-22 17:27  waketzheng  阅读(6)  评论(0)    收藏  举报