c1420b5665
排查「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>
28 lines
1.4 KiB
Docker
28 lines
1.4 KiB
Docker
# 第 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"]
|