51 lines
1.9 KiB
Docker
51 lines
1.9 KiB
Docker
# ============================================================
|
||
# Student System 后端 - 基于 FastAPI
|
||
# ============================================================
|
||
FROM python:3.10-slim AS base
|
||
|
||
# 防止 Python 生成 .pyc,启用 stdout/stderr 无缓冲(日志实时输出)
|
||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||
PYTHONUNBUFFERED=1 \
|
||
PIP_NO_CACHE_DIR=1 \
|
||
PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
||
TZ=Asia/Shanghai
|
||
|
||
WORKDIR /app
|
||
|
||
# 安装系统依赖(仅放置基础必需项,pymysql/aiomysql 客户端库依赖最少)
|
||
RUN apt-get update \
|
||
&& apt-get install -y --no-install-recommends \
|
||
tzdata \
|
||
curl \
|
||
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
|
||
&& echo $TZ > /etc/timezone \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# 配置 pip 国内镜像源(加速国内构建)
|
||
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \
|
||
&& pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn
|
||
|
||
# ---------- 依赖层(利用 Docker 缓存,仅当 requirements.txt 变化时重建) ----------
|
||
COPY requirements.txt .
|
||
# 兼容处理:若根目录 requirements.txt 不存在则回退到 fastapi-app/requirements_1.txt
|
||
RUN if [ ! -s requirements.txt ]; then \
|
||
echo "WARNING: requirements.txt 为空,回退使用 fastapi-app/requirements_1.txt"; \
|
||
cp fastapi-app/requirements_1.txt requirements.txt || true; \
|
||
fi
|
||
RUN pip install --no-cache-dir -r requirements.txt
|
||
|
||
# ---------- 代码层 ----------
|
||
COPY fastapi-app/ .
|
||
|
||
# 上传文件持久化目录(与 docker-compose.yml 中的 volume 对应)
|
||
VOLUME ["/app/files"]
|
||
|
||
EXPOSE 9090
|
||
|
||
# 健康检查:访问 /docs(FastAPI 默认 Swagger UI)验证容器健康
|
||
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
|
||
CMD curl -fsS http://127.0.0.1:9090/docs || exit 1
|
||
|
||
# 启动 Uvicorn;如需多 worker 可改为 --workers 2(注意数据库连接数)
|
||
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "9090"]
|