feat: Atomic update mcp image

This commit is contained in:
Ran
2026-02-05 02:40:10 +08:00
parent dd6d570eba
commit cb36b68ee4
12 changed files with 300 additions and 19 deletions
+5 -3
View File
@@ -10,6 +10,8 @@ ARG COMMIT_HASH=unknown
RUN CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH:-amd64} \
go build -trimpath -ldflags "-s -w -X github.com/memohai/memoh/internal/version.CommitHash=${COMMIT_HASH}" -o /out/mcp ./cmd/mcp
FROM busybox:latest
COPY --from=build /out/mcp /mcp
ENTRYPOINT ["/mcp"]
FROM alpine:latest
RUN apk add --no-cache grep
WORKDIR /app
COPY --from=build /out/mcp /app/mcp
ENTRYPOINT ["/app/mcp"]
+22 -3
View File
@@ -2,8 +2,12 @@ package main
import (
"context"
"errors"
"io"
"log/slog"
"os"
"os/signal"
"syscall"
"github.com/memohai/memoh/internal/logger"
"github.com/memohai/memoh/internal/mcp"
@@ -12,13 +16,28 @@ import (
)
func main() {
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
server := gomcp.NewServer(
&gomcp.Implementation{Name: "memoh-mcp", Version: version.GetInfo()},
nil,
)
mcp.RegisterTools(server)
if err := server.Run(context.Background(), &gomcp.StdioTransport{}); err != nil {
logger.Error("mcp server failed", slog.Any("error", err))
os.Exit(1)
err := server.Run(ctx, &gomcp.StdioTransport{})
if ctx.Err() != nil {
return
}
if err == nil {
logger.Warn("mcp server exited without error; waiting for shutdown signal")
<-ctx.Done()
return
}
if errors.Is(err, io.EOF) {
logger.Warn("mcp stdio closed; waiting for shutdown signal")
<-ctx.Done()
return
}
logger.Error("mcp server failed", slog.Any("error", err))
os.Exit(1)
}