62 lines
1.9 KiB
Plaintext
62 lines
1.9 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"]
|