Spaces:
Sleeping
Sleeping
| ############################### | |
| # Base Stage | |
| ############################### | |
| FROM python:3.13-slim AS base | |
| ENV PYTHONDONTWRITEBYTECODE=1 \ | |
| PYTHONUNBUFFERED=1 \ | |
| PIP_NO_CACHE_DIR=1 \ | |
| PIP_DISABLE_PIP_VERSION_CHECK=1 \ | |
| PIP_ROOT_USER_ACTION=ignore | |
| WORKDIR /app | |
| # System deps (可按需精简) | |
| RUN apt-get update && apt-get install -y --no-install-recommends \ | |
| curl ca-certificates tini && \ | |
| rm -rf /var/lib/apt/lists/* | |
| ############################### | |
| # Dependencies Stage | |
| ############################### | |
| FROM base AS deps | |
| COPY requirements.txt ./ | |
| RUN pip install --upgrade pip && pip install -r requirements.txt | |
| ############################### | |
| # Runtime Stage | |
| ############################### | |
| FROM base AS runtime | |
| # 创建非root用户 | |
| RUN useradd -m -u 1000 appuser | |
| # 复制已安装依赖 | |
| COPY --from=deps /usr/local/lib/python3.13 /usr/local/lib/python3.13 | |
| COPY --from=deps /usr/local/bin /usr/local/bin | |
| # 复制项目代码 | |
| COPY . . | |
| # 环境变量(HF Spaces 会自动传递 PORT) | |
| ENV HOST=0.0.0.0 \ | |
| PORT=7860 \ | |
| LOG_LEVEL=INFO | |
| # Expose for local run (HF 会忽略但仍可保留) | |
| EXPOSE 7860 | |
| # 切换用户 | |
| USER appuser | |
| # 健康检查脚本 (使用 shell 单行 Python 方式,兼容性更好) | |
| HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \ | |
| CMD python -c "import os,urllib.request,sys;port=os.environ.get('PORT','7860');\nimport urllib.error;\nurl=f'http://127.0.0.1:{port}/keepalive';\nreq=urllib.request.Request(url,method='HEAD');\n\ntry:\n resp=urllib.request.urlopen(req,timeout=5);\n sys.exit(0 if resp.getcode()==200 else 1)\nexcept Exception: sys.exit(1)" || exit 1 | |
| # 入口使用 tini 处理信号,优雅退出 | |
| ENTRYPOINT ["/usr/bin/tini","--"] | |
| # 默认启动命令:优先使用 app.py(支持 HF Spaces Gradio/Docker 双模式) | |
| CMD ["python","app.py"] |