# 第 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"]