FROM node:20-slim AS frontend-builder WORKDIR /build/templates/index # 安装前端依赖,并在镜像构建阶段生成 Vite 产物。 COPY templates/index/package.json templates/index/pnpm-lock.yaml templates/index/pnpm-workspace.yaml ./ RUN corepack enable && \ corepack prepare pnpm@9.15.9 --activate && \ pnpm install --frozen-lockfile COPY templates/index/ ./ RUN pnpm build FROM python:3.11-slim WORKDIR /app # 安装运行时系统依赖。 RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ ffmpeg \ && rm -rf /var/lib/apt/lists/* # 先安装 Python 依赖,提高 Docker 层缓存命中率。 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 先准备 vendor 目录,便于离线依赖下载脚本写入文件。 RUN mkdir -p /app/static/vendor # 只复制下载脚本,避免业务代码变化导致 vendor 依赖重复下载。 COPY scripts/download_offline_deps.py scripts/ RUN pip install --no-cache-dir requests && \ python scripts/download_offline_deps.py # 复制应用代码。 COPY . . # 使用前端构建阶段生成的产物覆盖源码中的旧产物。 COPY --from=frontend-builder /build/static/vite/index /app/static/vite/index # 创建容器运行时数据目录。 RUN mkdir -p /data/uploads /data/instance && \ chmod 755 /data/uploads /data/instance # 设置默认运行环境变量。 ENV FLASK_APP=src/app.py ENV SQLALCHEMY_DATABASE_URI=sqlite:////data/instance/transcriptions.db ENV UPLOAD_FOLDER=/data/uploads ENV PYTHONPATH=/app # 安装容器入口脚本。 COPY scripts/docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh # 暴露 Flask/Gunicorn 服务端口。 EXPOSE 8899 # 设置入口脚本和默认启动命令。 ENTRYPOINT ["docker-entrypoint.sh"] CMD ["gunicorn", "--workers", "3", "--threads", "8", "--bind", "0.0.0.0:8899", "--timeout", "600", "src.app:app"]