# syntax=docker/dockerfile:1 ############################################################################### # All-in-one LSP Gateway Image # - Go → gopls # - JS / TS → typescript-language-server # - Java → Eclipse JDT Language Server (jdtls) + JDK 22 ############################################################################### # ── Stage 1: Build Go gateway binary ──────────────────────────────────────── FROM golang:1.25-bookworm AS builder WORKDIR /src COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags="-s -w" -o /out/server ./cmd/server # ── Stage 2: Build gopls ──────────────────────────────────────────────────── FROM golang:1.25-bookworm AS gopls-builder RUN go install golang.org/x/tools/gopls@latest # ── Stage 3: Runtime ──────────────────────────────────────────────────────── FROM eclipse-temurin:22-jdk-noble ARG NODE_MAJOR=22 # ---- System deps: Node.js, python3 (jdtls launcher) ---- RUN apt-get update && \ apt-get install -y --no-install-recommends ca-certificates curl python3 && \ curl -fsSL https://deb.nodesource.com/setup_${NODE_MAJOR}.x | bash - && \ apt-get install -y --no-install-recommends nodejs && \ rm -rf /var/lib/apt/lists/* # ---- typescript-language-server (covers JavaScript + TypeScript) ---- RUN npm install -g typescript-language-server typescript && \ npm cache clean --force # ---- Go toolchain (gopls needs it at runtime for analysis) ---- COPY --from=golang:1.25-bookworm /usr/local/go /usr/local/go ENV PATH="/usr/local/go/bin:/go/bin:${PATH}" \ GOPATH="/go" # ---- gopls ---- COPY --from=gopls-builder /go/bin/gopls /go/bin/gopls # ---- Eclipse JDT Language Server ---- COPY jdt-language-server-1.57.0-202602111032 /opt/jdtls RUN chmod +x /opt/jdtls/bin/jdtls /opt/jdtls/bin/jdtls.py # ---- Gateway binary ---- WORKDIR /app COPY --from=builder /out/server /app/server COPY config.example.json /app/config.example.json # ---- Default config: all 4 LSP servers, Redis/Nacos off by default ---- COPY <<'EOF' /app/config.json { "port": "8080", "workspaceDir": "/workspace", "allowOrigin": "*", "requestTimeout": "30s", "sessionTTL": "20m", "cleanupInterval": "2m", "maxSessions": 256, "enableRedis": false, "enableNacosRegister": false, "appEnv": "prod", "logLevel": "info", "logConsoleEnabled": true, "servers": [ { "language": "go", "languageId": "go", "command": "gopls", "args": [] }, { "language": "javascript", "languageId": "javascript", "command": "typescript-language-server", "args": ["--stdio"] }, { "language": "typescript", "languageId": "typescript", "command": "typescript-language-server", "args": ["--stdio"] }, { "language": "java", "languageId": "java", "command": "/opt/jdtls/bin/jdtls", "args": [] } ] } EOF # ---- Directories & non-root user ---- RUN mkdir -p /workspace /go && \ groupadd --system app && \ useradd --system --gid app --home-dir /home/app --create-home app && \ chown -R app:app /app /workspace /go /home/app ENV PORT=8080 \ WORKSPACE_DIR=/workspace EXPOSE 8080 USER app ENTRYPOINT ["/app/server"]