SmartMeeting/speakr/Dockerfile20260710

62 lines
2.0 KiB
Plaintext

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"]