Files
Blizzard c1420b5665 fix(rag): 全文索引在容器里根本没持久化 —— 补 /data 卷 + BLEVE_PATH
排查「fulltext 路 0 命中」时发现的真问题,比原以为的分词器问题严重得多。

现状:mcp-go 容器**没有任何 volume**,也没设 BLEVE_PATH,于是索引落到相对
CWD 的 .data/bleve。而运行阶段没有 WORKDIR(CWD=/)、进程又是非 root(uid 10001),
两种结局都糟:
  - 在 / 下建不了目录 → openBleve 静默退回内存索引,重启即清零;
  - 就算建得了,也只是写进容器可写层,每次发版重建容器一样清零。
更糟的是它不报错:混合检索少一路只表现为召回变差,看不出故障。

改动:
  - Dockerfile:建 /data 并 chown 给 app,WORKDIR 设为 /data;
  - 两份 compose:BLEVE_PATH=/data/bleve + 挂持久卷(132 那份此前连
    顶层 volumes 段都没有);
  - .env.example:写清默认相对路径相对的是**启动目录**——本地从仓库根起
    和从 sundynix-mcp-go/ 起会写出两份互不相干的索引,排查时极易被坑。

附带澄清:中文分词本身没问题。直接开落盘索引验证过,mapping 里 text 字段
确实是 cjk,实测「星间链」命中 4 条、「海关监管」命中 104 条,BM25 打分正常。
a4852c3 那次修复是有效的,之前怀疑分词器的判断作废。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 13:40:31 +08:00

28 lines
1.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.
# 第 5 层 Go I/O 型 MCP 工具(检索/入库/报告渲染等)。多阶段构建(上下文须为仓库根):
# docker build -f sundynix-mcp-go/Dockerfile -t sundynix/mcp-go .
FROM golang:1.25-alpine AS build
WORKDIR /src
COPY sundynix-shared/go.mod sundynix-shared/go.sum ./sundynix-shared/
COPY sundynix-mcp-go/go.mod sundynix-mcp-go/go.sum ./sundynix-mcp-go/
WORKDIR /src/sundynix-mcp-go
ENV GOWORK=off GOFLAGS=-mod=mod GOPROXY=https://goproxy.cn,direct
RUN go mod download
WORKDIR /src
COPY sundynix-shared/ ./sundynix-shared/
COPY sundynix-mcp-go/ ./sundynix-mcp-go/
WORKDIR /src/sundynix-mcp-go
RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/mcp-go ./cmd/server
# alpine 运行(内网 runner 连不上 gcr.io;二进制 CGO_ENABLED=0 全静态,ca-certs 供 TLS)。
FROM alpine:3.20
RUN sed -i 's#dl-cdn.alpinelinux.org#mirrors.aliyun.com#g' /etc/apk/repositories \
&& apk add --no-cache ca-certificates tzdata && adduser -D -u 10001 app \
# /data 存 bleve 全文索引:必须由 app 拥有(进程非 root),且 compose 要挂持久卷。
# 没有它的话 BLEVE_PATH 默认相对 CWD(=/)uid 10001 在 / 下建不了目录 → 静默退回
# 内存索引,全文路每次重启清零,而混合检索只会少一路召回、不报错。
&& mkdir -p /data && chown app:app /data
USER app
WORKDIR /data
COPY --from=build /out/mcp-go /mcp-go
ENTRYPOINT ["/mcp-go"]