Files
MonocoEditor-With-Lsp-Backend/backend/Dockerfile

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