90 lines
3.4 KiB
Docker
90 lines
3.4 KiB
Docker
# 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"]
|