Files
toor 79baab6080 feat: 新增 HTTP MCP Server,让 AI Agent 接入选菜
新增 packages/mcp,基于 Streamable HTTP 暴露菜谱库能力,复用 packages/cook 的选菜算法:recommend_recipes 按现有食材推荐,search_recipes 条件检索,check_incompatible 食材相克,get_recipe 菜谱详情。容器内与 nginx 共存,映射 2230 端口供 Agent 连接。
2026-10-22 16:55:29 +08:00

72 lines
2.4 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ---------- 构建阶段 ----------
FROM node:24-alpine AS builder
# pnpm 版本与 package.json 的 packageManager 字段保持一致
RUN npm install -g pnpm@11.21.0
WORKDIR /app
# 构建期关闭遥上报,避免容器构建时产生外部请求
ENV NUXT_TELEMETRY_DISABLED=1
# 先只复制依赖清单,让 pnpm install 这一层可以被缓存复用
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY apps/web/package.json apps/web/package.json
COPY packages/cook/package.json packages/cook/package.json
COPY packages/mcp/package.json packages/mcp/package.json
COPY docs/package.json docs/package.json
RUN pnpm install --frozen-lockfile
# 再复制源码并构建
COPY . .
# 统计配置在构建期编译进静态产物
ARG NUXT_PUBLIC_CLARITY_PROJECT_ID=ks1ebw03i5
ARG NUXT_PUBLIC_CLARITY_DOMAINS=cook.yunyoujun.cn,cook.yunle.fun
ENV NUXT_PUBLIC_CLARITY_PROJECT_ID=${NUXT_PUBLIC_CLARITY_PROJECT_ID}
ENV NUXT_PUBLIC_CLARITY_DOMAINS=${NUXT_PUBLIC_CLARITY_DOMAINS}
# 镜像里没有 .git,版本号组件拿不到 commit;传入该值即可显示版本信息
ARG CF_PAGES_COMMIT_SHA=
ENV CF_PAGES_COMMIT_SHA=${CF_PAGES_COMMIT_SHA}
# 构建产物输出到仓库根目录的 dist/(见 scripts/copy-web-output.ts)
RUN pnpm run build
# MCP Server 依赖 @yunyoujun/cook 的构建产物,根 build 不含它,需单独构建
RUN pnpm -C packages/cook run build \
&& pnpm -C packages/mcp run build
# MCP Server 的生产依赖(含 workspace 包 @yunyoujun/cook 的构建产物)
RUN pnpm --filter @cook/mcp deploy --legacy --prod /app/mcp-deploy
# ---------- 运行阶段 ----------
FROM nginx:stable-alpine
# MCP Server 需要 Node 运行时,与 nginx 共存于同一容器
RUN apk add --no-cache nodejs npm \
&& mkdir -p /data
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/dist /usr/share/nginx/html
COPY --from=builder /app/mcp-deploy /opt/cook-mcp
COPY --from=builder /app/packages/data/recipe.csv /data/recipe.csv
COPY --from=builder /app/packages/data/incompatible-foods.csv /data/incompatible-foods.csv
COPY docker/entrypoint.sh /usr/local/bin/cook-entrypoint
RUN chmod +x /usr/local/bin/cook-entrypoint
ENV COOK_DATA_DIR=/data \
COOK_MCP_PORT=2230 \
COOK_MCP_HOST=0.0.0.0 \
COOK_MCP_PATH=/mcp
EXPOSE 2229 2230
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -qO- http://127.0.0.1:2229/ >/dev/null || exit 1
ENTRYPOINT ["/usr/local/bin/cook-entrypoint"]