FROM python:3.11-slim WORKDIR /app # ============================================================ # 系统依赖(含编译 bcrypt/cryptography 所需的 build-essential) # 使用清华镜像加速(国内环境) # ============================================================ RUN sed -i 's|deb.debian.org|mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || true RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ ca-certificates \ build-essential \ libffi-dev \ libssl-dev \ default-mysql-client \ redis-tools \ netcat-openbsd \ nginx \ && rm -rf /var/lib/apt/lists/* # ============================================================ # 安装 Node.js(用于前端构建) # ============================================================ RUN sed -i 's|deb.debian.org|mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || true RUN apt-get update && apt-get install -y --no-install-recommends \ nodejs \ npm \ && rm -rf /var/lib/apt/lists/* # ============================================================ # 复制项目源码 # ============================================================ COPY backend/ /app/backend/ COPY frontend/ /app/frontend/ COPY migrations/ /app/migrations/ COPY nginx.conf /app/nginx.conf COPY VERSION /app/VERSION COPY CHANGELOG.md /app/CHANGELOG.md COPY run.sh /app/run.sh # ============================================================ # 安装 Python 依赖到虚拟环境(与 run.sh 的 .venv 优先逻辑一致) # 说明:run.sh 启动时会优先使用 $PYTHON_DIR/.venv, # 此处把依赖直接烤进镜像的 .venv,避免运行时再联网安装导致崩溃循环。 # ============================================================ RUN python3 -m venv /app/backend/python/.venv && \ /app/backend/python/.venv/bin/pip install --no-cache-dir \ -r /app/backend/python/requirements.txt \ -i https://pypi.tuna.tsinghua.edu.cn/simple # ============================================================ # 安装前端依赖并构建(使用国内 npm 镜像) # ============================================================ RUN cd /app/frontend && npm install --registry=https://registry.npmmirror.com && npm run build # 验证前端构建产物 RUN test -f /app/frontend/dist/index.html || (echo "ERROR: 前端构建失败,index.html 不存在" && exit 1) RUN test -d /app/frontend/dist/assets || (echo "ERROR: 前端构建失败,assets 目录不存在" && exit 1) RUN echo "前端构建完成,dist 目录大小: $(du -sh /app/frontend/dist | cut -f1)" # ============================================================ # 配置 nginx:移除默认站点,写入自定义配置 # ============================================================ RUN rm -f /etc/nginx/sites-enabled/default && \ rm -f /etc/nginx/conf.d/default.conf 2>/dev/null || true; \ cp /app/nginx.conf /etc/nginx/conf.d/aiflow.conf && \ sed -i 's/include \/etc\/nginx\/sites-enabled\/\*;/# include \/etc\/nginx\/sites-enabled\/*;/' /etc/nginx/nginx.conf && \ mkdir -p /var/log/nginx && \ chown -R www-data:www-data /var/log/nginx && \ chown -R www-data:www-data /var/lib/nginx # 复制启动脚本并设置权限 RUN chmod +x /app/run.sh EXPOSE 8080 18080 CMD ["/app/run.sh"]