# syntax=docker/dockerfile:1 FROM node:22-bookworm-slim AS frontend WORKDIR /build/frontend COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build FROM python:3.12-slim-bookworm AS runtime ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ LANG=C.UTF-8 \ TZ=Asia/Shanghai \ DEEP_AGENT_ENV_PRIORITY=process \ HOST=0.0.0.0 \ PORT=8080 \ LOG_LEVEL=INFO \ LOG_FORMAT=json \ LOG_FILE=/app/logs/ventagent.jsonl \ TIKTOKEN_CACHE_DIR=/usr/local/share/tiktoken \ MAIN_FAN_REPORT_MODE=crawler \ MAIN_FAN_REPORT_API_URL=http://10.244.3.155:19010 \ MAIN_FAN_REPORT_SOURCE_DIR=/data/source_data \ RESULT_PLATFORM_ENABLED=False \ MAIN_FAN_WORKFLOW_PUBLISH_ENABLED=False # 工作流默认本地核验;未来上报须同时开启总开关与 MAIN_FAN_WORKFLOW_PUBLISH_ENABLED。 # URL、token、模型配置在运行时通过 --env-file 注入,不写入镜像。 WORKDIR /app RUN apt-get update \ && apt-get install -y --no-install-recommends bubblewrap ca-certificates tzdata \ fonts-noto-cjk fontconfig libglib2.0-0 libgomp1 \ && rm -rf /var/lib/apt/lists/* COPY release/requirements.lock /tmp/requirements.lock RUN pip install --no-cache-dir --require-hashes -r /tmp/requirements.lock \ && rm /tmp/requirements.lock # 联网构建时保存分词词表;离线运行时无需首次下载。 RUN python -c "import tiktoken; [tiktoken.get_encoding(name) for name in ('cl100k_base', 'o200k_base')]" RUN groupadd --gid 10001 ventagent \ && useradd --uid 10001 --gid ventagent --create-home ventagent COPY --chown=ventagent:ventagent . /app COPY --from=frontend --chown=ventagent:ventagent /build/static/ /app/static/ RUN mkdir -p /app/data /app/outputs /app/logs \ && chown -R ventagent:ventagent /app/data /app/outputs /app/logs ENV BILLING_ENABLED=False \ DEEPAGENT_THINKING=highest \ OPENAI_TOOL_CALL_STREAMING=False USER ventagent EXPOSE 8080 STOPSIGNAL SIGTERM HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \ CMD python -c "import json,os,urllib.request; r=json.load(urllib.request.urlopen('http://127.0.0.1:'+os.getenv('PORT','8080')+'/health',timeout=3)); raise SystemExit(r.get('status') != 'ok')" CMD ["python", "main.py"]