From 8f82510f434bc182cdcb335119362539a757372a Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Wed, 16 Jul 2025 12:34:29 -0700 Subject: [PATCH 01/15] feat: init claude configuration --- CLAUDE.md | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..b831a65 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,99 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This repository contains Dockerfiles for Language Server Protocol (LSP) servers used with `lspcontainers`. Each language server is containerized to provide consistent development environments across different platforms. + +## Build Commands + +### Building Docker Images +- `docker-compose build ` - Build a specific server (e.g., `docker-compose build tsserver`) +- `docker-compose build` - Build all servers +- `docker-compose build --parallel` - Build all servers in parallel (faster) + +### Available Servers +The docker-compose.yaml defines 24 language servers: +- `bashls` - Bash Language Server +- `clangd` - C/C++ Language Server +- `denols` - Deno Language Server +- `dockerls` - Docker Language Server +- `eslintls` - ESLint Language Server +- `gopls` - Go Language Server +- `graphql-lsp` - GraphQL Language Service +- `html` - HTML Language Server +- `intelephense` - PHP Language Server +- `jsonls` - JSON Language Server +- `lemminx` - XML Language Server +- `omnisharp` - C# Language Server +- `powershell_es` - PowerShell Language Server +- `prisma` - Prisma Language Server +- `pylsp` - Python LSP Server +- `pyright` - Python Language Server +- `rust_analyzer` - Rust Language Server +- `solargraph` - Ruby Language Server +- `sumneko_lua` - Lua Language Server +- `svelteserver` - Svelte Language Server +- `tailwindcss` - Tailwind CSS Language Server +- `terraformls` - Terraform Language Server +- `tsserver` - TypeScript Language Server +- `volar` - Vue Language Server (Volar) +- `vuels` - Vue Language Server (legacy) +- `yamlls` - YAML Language Server + +### Linting +The CI workflow uses hadolint to lint Dockerfiles: +```bash +docker run --rm -v $(pwd):/code -w /code hadolint/hadolint:latest-alpine servers//Dockerfile +``` + +## Architecture + +### Repository Structure +``` +servers/ +├── / +│ ├── Dockerfile # Container definition +│ └── docker_entrypoint.sh # Optional entrypoint script (e.g., gopls) +├── docker-compose.yaml # Service definitions +└── .github/workflows/ # CI/CD automation +``` + +### Container Patterns +1. **Alpine-based**: All containers use Alpine Linux as the base image for minimal size +2. **Package managers**: Different servers use appropriate package managers: + - Node.js servers: `npm` or `yarn` + - Go servers: `go install` + - Python servers: `pip` + - Ruby servers: `gem` +3. **User management**: Some containers (like gopls) create dedicated users with sudo access +4. **Entrypoint scripts**: Complex setups use shell scripts for runtime configuration + +### Special Cases +- **gopls**: Uses a custom entrypoint script to handle user/group ID mapping +- **volar**: Pinned to specific version (1.8.11) in environment variable +- **tsserver**: Includes Vue TypeScript plugin for Vue.js support + +### CI/CD Pipeline +The GitHub Actions workflow: +1. Runs hadolint on each Dockerfile +2. Builds images using Docker Buildx +3. Pushes to Docker Hub on main branch +4. Runs daily builds via cron schedule +5. Uses matrix strategy to build all servers in parallel + +### Container Tagging +Each container has two tags: +- `latest`: Points to the most recent build +- Pinned version: Latest version of the language server + +## Development Guidelines + +When adding new language servers: +1. Create a new directory under `servers/` +2. Write a Dockerfile following Alpine Linux pattern +3. Add the service to `docker-compose.yaml` +4. Update the CI workflow matrix in `.github/workflows/build-image.yml` +5. Test locally with `docker-compose build ` +6. Verify with hadolint: `docker run --rm -v $(pwd):/code -w /code hadolint/hadolint:latest-alpine servers//Dockerfile` \ No newline at end of file From 2b1d6218c23e0a415125289a0c666ce6001ccd8c Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Wed, 16 Jul 2025 12:38:33 -0700 Subject: [PATCH 02/15] feat(github): rename file for changes --- .github/workflows/{build-image.yml => build-and-push.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{build-image.yml => build-and-push.yml} (99%) diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-and-push.yml similarity index 99% rename from .github/workflows/build-image.yml rename to .github/workflows/build-and-push.yml index e7eaae8..4348aa1 100644 --- a/.github/workflows/build-image.yml +++ b/.github/workflows/build-and-push.yml @@ -1,4 +1,4 @@ -name: Push LSP Docker Images +name: build-and-push on: pull_request: From e048e9f1d88defb9a9c87463454824f6179f4af1 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:25:18 -0700 Subject: [PATCH 03/15] feat: update all Dockerfiles to use static versioned base images Updated 26 Dockerfiles from dynamic tags to static versions: - 22 Alpine images: alpine -> alpine:3.22.1 - 2 Debian images: debian -> debian:12.11-slim - 1 Rust image: rustlang/rust:nightly -> rust:1.88.0-alpine3.22 - 1 Deno image: denoland/deno:alpine -> denoland/deno:alpine-2.4.2 - 1 PowerShell image: mcr.microsoft.com/powershell:alpine -> mcr.microsoft.com/powershell:7.5-alpine-3.20 This improves build reproducibility and security by pinning to specific versions. --- servers/bashls/Dockerfile | 2 +- servers/clangd/Dockerfile | 2 +- servers/denols/Dockerfile | 2 +- servers/dockerls/Dockerfile | 2 +- servers/eslintls/Dockerfile | 2 +- servers/gopls/Dockerfile | 2 +- servers/graphql-lsp/Dockerfile | 2 +- servers/html/Dockerfile | 2 +- servers/intelephense/Dockerfile | 2 +- servers/jsonls/Dockerfile | 2 +- servers/lemminx/Dockerfile | 2 +- servers/omnisharp/Dockerfile | 2 +- servers/powershell_es/Dockerfile | 2 +- servers/prisma/Dockerfile | 2 +- servers/pylsp/Dockerfile | 4 ++-- servers/pyright/Dockerfile | 2 +- servers/rust_analyzer/Dockerfile | 2 +- servers/solargraph/Dockerfile | 2 +- servers/sumneko_lua/Dockerfile | 2 +- servers/svelteserver/Dockerfile | 2 +- servers/tailwindcss/Dockerfile | 2 +- servers/terraformls/Dockerfile | 4 ++-- servers/tsserver/Dockerfile | 2 +- servers/volar/Dockerfile | 2 +- servers/vuels/Dockerfile | 2 +- servers/yamlls/Dockerfile | 2 +- 26 files changed, 28 insertions(+), 28 deletions(-) diff --git a/servers/bashls/Dockerfile b/servers/bashls/Dockerfile index 32c9e85..a02c1e5 100644 --- a/servers/bashls/Dockerfile +++ b/servers/bashls/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 # using npm breaks shellcheck download of its binary from api.github.com # running shellcheck -V forces it to download its binary during build diff --git a/servers/clangd/Dockerfile b/servers/clangd/Dockerfile index a632ae1..82563f7 100644 --- a/servers/clangd/Dockerfile +++ b/servers/clangd/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ build-base \ diff --git a/servers/denols/Dockerfile b/servers/denols/Dockerfile index 25fce1d..1b318b1 100644 --- a/servers/denols/Dockerfile +++ b/servers/denols/Dockerfile @@ -1,3 +1,3 @@ -FROM denoland/deno:alpine +FROM denoland/deno:alpine-2.4.2 CMD [ "lsp" ] diff --git a/servers/dockerls/Dockerfile b/servers/dockerls/Dockerfile index 4de748e..64d152a 100644 --- a/servers/dockerls/Dockerfile +++ b/servers/dockerls/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/eslintls/Dockerfile b/servers/eslintls/Dockerfile index c39a35f..08189da 100644 --- a/servers/eslintls/Dockerfile +++ b/servers/eslintls/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ git \ diff --git a/servers/gopls/Dockerfile b/servers/gopls/Dockerfile index e707ca3..03cbeb8 100644 --- a/servers/gopls/Dockerfile +++ b/servers/gopls/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ bash \ diff --git a/servers/graphql-lsp/Dockerfile b/servers/graphql-lsp/Dockerfile index c87b880..bebb9b5 100644 --- a/servers/graphql-lsp/Dockerfile +++ b/servers/graphql-lsp/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/html/Dockerfile b/servers/html/Dockerfile index 8c87c4c..8be3290 100644 --- a/servers/html/Dockerfile +++ b/servers/html/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/intelephense/Dockerfile b/servers/intelephense/Dockerfile index 3a4037f..05a03e2 100644 --- a/servers/intelephense/Dockerfile +++ b/servers/intelephense/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/jsonls/Dockerfile b/servers/jsonls/Dockerfile index 0f08733..7589718 100644 --- a/servers/jsonls/Dockerfile +++ b/servers/jsonls/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/lemminx/Dockerfile b/servers/lemminx/Dockerfile index f6eba40..21a9a6a 100644 --- a/servers/lemminx/Dockerfile +++ b/servers/lemminx/Dockerfile @@ -1,4 +1,4 @@ -FROM debian +FROM debian:12.11-slim # The binary requires gnu-libc and will not work on alpine WORKDIR /tmp diff --git a/servers/omnisharp/Dockerfile b/servers/omnisharp/Dockerfile index ea10160..04d9665 100644 --- a/servers/omnisharp/Dockerfile +++ b/servers/omnisharp/Dockerfile @@ -1,4 +1,4 @@ -FROM debian +FROM debian:12.11-slim WORKDIR /tmp diff --git a/servers/powershell_es/Dockerfile b/servers/powershell_es/Dockerfile index 5ddce3c..2ce69a0 100644 --- a/servers/powershell_es/Dockerfile +++ b/servers/powershell_es/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/powershell:alpine +FROM mcr.microsoft.com/powershell:7.5-alpine-3.20 WORKDIR /srv diff --git a/servers/prisma/Dockerfile b/servers/prisma/Dockerfile index f50493a..b13ea41 100644 --- a/servers/prisma/Dockerfile +++ b/servers/prisma/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/pylsp/Dockerfile b/servers/pylsp/Dockerfile index 57fcb8b..7ff965e 100644 --- a/servers/pylsp/Dockerfile +++ b/servers/pylsp/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine as build +FROM alpine:3.22.1 as build RUN apk add --no-cache \ build-base \ @@ -12,7 +12,7 @@ WORKDIR /venv RUN /venv/bin/pip install "python-lsp-server[all]" -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache python3 py3-pip diff --git a/servers/pyright/Dockerfile b/servers/pyright/Dockerfile index 78bec3c..c535649 100644 --- a/servers/pyright/Dockerfile +++ b/servers/pyright/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/rust_analyzer/Dockerfile b/servers/rust_analyzer/Dockerfile index 2d48643..c83d9d2 100644 --- a/servers/rust_analyzer/Dockerfile +++ b/servers/rust_analyzer/Dockerfile @@ -1,4 +1,4 @@ -FROM rustlang/rust:nightly +FROM rust:1.88.0-alpine3.22 RUN rustup component add rust-analyzer diff --git a/servers/solargraph/Dockerfile b/servers/solargraph/Dockerfile index 8994425..792707f 100644 --- a/servers/solargraph/Dockerfile +++ b/servers/solargraph/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ g++ \ diff --git a/servers/sumneko_lua/Dockerfile b/servers/sumneko_lua/Dockerfile index ac71e37..9324b5d 100644 --- a/servers/sumneko_lua/Dockerfile +++ b/servers/sumneko_lua/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --update --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ lua-language-server diff --git a/servers/svelteserver/Dockerfile b/servers/svelteserver/Dockerfile index 4b73332..dfcfe82 100644 --- a/servers/svelteserver/Dockerfile +++ b/servers/svelteserver/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/tailwindcss/Dockerfile b/servers/tailwindcss/Dockerfile index 86c43a3..dd272e3 100644 --- a/servers/tailwindcss/Dockerfile +++ b/servers/tailwindcss/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/terraformls/Dockerfile b/servers/terraformls/Dockerfile index ad37d76..8f95c66 100644 --- a/servers/terraformls/Dockerfile +++ b/servers/terraformls/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine AS build +FROM alpine:3.22.1 AS build ARG TF_LS_VERSION=0.29.3 ARG TF_VERSION=1.3.3 @@ -28,7 +28,7 @@ RUN curl --proto '=https' \ && unzip terraform-ls_${TF_LS_VERSION}_linux_amd64.zip \ && unzip terraform_${TF_VERSION}_linux_amd64.zip -FROM alpine +FROM alpine:3.22.1 COPY --from=build /build/terraform-ls /usr/bin/terraform-ls COPY --from=build /build/terraform /usr/bin/terraform diff --git a/servers/tsserver/Dockerfile b/servers/tsserver/Dockerfile index 7f051f1..e9695c3 100644 --- a/servers/tsserver/Dockerfile +++ b/servers/tsserver/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/volar/Dockerfile b/servers/volar/Dockerfile index feda3fa..963e92d 100644 --- a/servers/volar/Dockerfile +++ b/servers/volar/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache nodejs npm diff --git a/servers/vuels/Dockerfile b/servers/vuels/Dockerfile index d605f29..ce5ee59 100644 --- a/servers/vuels/Dockerfile +++ b/servers/vuels/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ diff --git a/servers/yamlls/Dockerfile b/servers/yamlls/Dockerfile index 01aaaa8..7c6826d 100644 --- a/servers/yamlls/Dockerfile +++ b/servers/yamlls/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine +FROM alpine:3.22.1 RUN apk add --no-cache \ nodejs \ From 00b603be3f6414a94fd7d1fb86ba771a68c534c8 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:05:52 -0700 Subject: [PATCH 04/15] feat: pin all package versions for reproducible builds Update all Dockerfiles to use explicit package versions for: - Alpine packages (apk): nodejs, npm, yarn, git, python3, etc. - Debian packages (apt): curl, ca-certificates, unzip - npm packages: language servers and dependencies - Ruby gems: solargraph - Go packages: gopls tools and dependencies This ensures reproducible builds by preventing version drift and eliminates package version conflicts during container builds. --- servers/bashls/Dockerfile | 8 ++++---- servers/clangd/Dockerfile | 4 ++-- servers/dockerls/Dockerfile | 6 +++--- servers/eslintls/Dockerfile | 6 +++--- servers/gopls/Dockerfile | 28 ++++++++++++++-------------- servers/graphql-lsp/Dockerfile | 6 +++--- servers/html/Dockerfile | 6 +++--- servers/intelephense/Dockerfile | 6 +++--- servers/jsonls/Dockerfile | 6 +++--- servers/lemminx/Dockerfile | 8 ++++---- servers/omnisharp/Dockerfile | 6 +++--- servers/powershell_es/Dockerfile | 6 +++--- servers/prisma/Dockerfile | 6 +++--- servers/pylsp/Dockerfile | 12 ++++++------ servers/pyright/Dockerfile | 6 +++--- servers/solargraph/Dockerfile | 16 ++++++++-------- servers/sumneko_lua/Dockerfile | 2 +- servers/svelteserver/Dockerfile | 6 +++--- servers/tailwindcss/Dockerfile | 8 ++++---- servers/terraformls/Dockerfile | 8 ++++---- servers/tsserver/Dockerfile | 10 +++++----- servers/volar/Dockerfile | 2 +- servers/vuels/Dockerfile | 6 +++--- servers/yamlls/Dockerfile | 6 +++--- 24 files changed, 92 insertions(+), 92 deletions(-) diff --git a/servers/bashls/Dockerfile b/servers/bashls/Dockerfile index a02c1e5..8a447af 100644 --- a/servers/bashls/Dockerfile +++ b/servers/bashls/Dockerfile @@ -3,11 +3,11 @@ FROM alpine:3.22.1 # using npm breaks shellcheck download of its binary from api.github.com # running shellcheck -V forces it to download its binary during build RUN apk add --no-cache \ - nodejs \ - yarn \ + nodejs=22.16.0-r2 \ + yarn=1.22.22-r1 \ && yarn global add \ - shellcheck \ - bash-language-server \ + shellcheck@3.1.0 \ + bash-language-server@5.6.0 \ && shellcheck -V CMD [ "bash-language-server", "start" ] diff --git a/servers/clangd/Dockerfile b/servers/clangd/Dockerfile index 82563f7..2307b05 100644 --- a/servers/clangd/Dockerfile +++ b/servers/clangd/Dockerfile @@ -1,7 +1,7 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - build-base \ - clang-extra-tools + build-base=0.5-r3 \ + clang-extra-tools=20.1.8-r0 CMD [ "clangd", "--background-index" ] diff --git a/servers/dockerls/Dockerfile b/servers/dockerls/Dockerfile index 64d152a..dba43f6 100644 --- a/servers/dockerls/Dockerfile +++ b/servers/dockerls/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - dockerfile-language-server-nodejs + dockerfile-language-server-nodejs@0.14.0 CMD [ "docker-langserver", "--stdio" ] diff --git a/servers/eslintls/Dockerfile b/servers/eslintls/Dockerfile index 08189da..0ddc792 100644 --- a/servers/eslintls/Dockerfile +++ b/servers/eslintls/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - git \ - nodejs \ - npm + git=2.49.1-r0 \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 WORKDIR /tmp diff --git a/servers/gopls/Dockerfile b/servers/gopls/Dockerfile index 03cbeb8..88ab371 100644 --- a/servers/gopls/Dockerfile +++ b/servers/gopls/Dockerfile @@ -1,10 +1,11 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - bash \ - go \ - shadow \ - sudo + bash=5.2.37-r0 \ + git=2.49.1-r0 \ + go=1.24.4-r0 \ + shadow=4.17.3-r0 \ + sudo=1.9.17_p1-r0 ENV GO111MODULE="on" @@ -19,16 +20,15 @@ USER lspcontainers ENV GOBIN="/home/lspcontainers/.bin" ENV PATH="${GOBIN}:$PATH" -RUN go install github.com/uudashr/gopkgs/v2/cmd/gopkgs@latest \ - && go install github.com/ramya-rao-a/go-outline@latest \ - && go install github.com/cweill/gotests/gotests@latest \ - && go install github.com/fatih/gomodifytags@latest \ - && go install github.com/josharian/impl@latest \ - && go install github.com/haya14busa/goplay/cmd/goplay@latest \ - && go install github.com/go-delve/delve/cmd/dlv@latest \ - && go install github.com/go-delve/delve/cmd/dlv@latest \ - && go install honnef.co/go/tools/cmd/staticcheck@latest \ - && go install golang.org/x/tools/gopls@latest +RUN go install github.com/uudashr/gopkgs/v2/cmd/gopkgs@v2.3.0 \ + && go install github.com/ramya-rao-a/go-outline@v0.0.0-20230705182323-5c2c3ef6aa00 \ + && go install github.com/cweill/gotests/gotests@v1.6.3 \ + && go install github.com/fatih/gomodifytags@v1.17.0 \ + && go install github.com/josharian/impl@v1.4.0 \ + && go install github.com/haya14busa/goplay/cmd/goplay@v1.0.0 \ + && go install github.com/go-delve/delve/cmd/dlv@v1.24.2 \ + && go install honnef.co/go/tools/cmd/staticcheck@2024.1.1 \ + && go install golang.org/x/tools/gopls@v0.17.0 COPY --chown=lspcontainers:lspcontainers \ docker_entrypoint.sh /home/lspcontainers/docker_entrypoint.sh diff --git a/servers/graphql-lsp/Dockerfile b/servers/graphql-lsp/Dockerfile index bebb9b5..0d02810 100644 --- a/servers/graphql-lsp/Dockerfile +++ b/servers/graphql-lsp/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - graphql-language-service-cli + graphql-language-service-cli@3.5.0 CMD [ "graphql-lsp", "server" , "-m", "stream" ] diff --git a/servers/html/Dockerfile b/servers/html/Dockerfile index 8be3290..24d90d0 100644 --- a/servers/html/Dockerfile +++ b/servers/html/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - vscode-html-languageserver-bin + vscode-html-languageserver-bin@1.4.0 CMD [ "html-languageserver", "--stdio" ] diff --git a/servers/intelephense/Dockerfile b/servers/intelephense/Dockerfile index 05a03e2..ab86ed0 100644 --- a/servers/intelephense/Dockerfile +++ b/servers/intelephense/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - intelephense + intelephense@1.14.4 CMD [ "intelephense", "--stdio" ] diff --git a/servers/jsonls/Dockerfile b/servers/jsonls/Dockerfile index 7589718..46842c6 100644 --- a/servers/jsonls/Dockerfile +++ b/servers/jsonls/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - vscode-langservers-extracted + vscode-langservers-extracted@4.10.0 CMD [ "vscode-json-language-server", "--stdio" ] diff --git a/servers/lemminx/Dockerfile b/servers/lemminx/Dockerfile index 21a9a6a..f468a6e 100644 --- a/servers/lemminx/Dockerfile +++ b/servers/lemminx/Dockerfile @@ -7,11 +7,11 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -y \ && apt-get install --yes --no-install-recommends -o APT::Install-Suggests=0 -o APT::Install-Recommends=0 \ - curl \ - ca-certificates \ - unzip \ + curl=7.88.1-10+deb12u12 \ + ca-certificates=20230311+deb12u1 \ + unzip=6.0-28 \ && update-ca-certificates \ -&& curl -sL -O https://github.com/redhat-developer/vscode-xml/releases/download/0.26.1/lemminx-linux.zip \ +&& curl -sL -O https://github.com/redhat-developer/vscode-xml/releases/download/0.27.0/lemminx-linux.zip \ && unzip lemminx-linux.zip \ && rm -rf lemminx-linux.zip \ && apt-get remove curl unzip -y \ diff --git a/servers/omnisharp/Dockerfile b/servers/omnisharp/Dockerfile index 04d9665..d39824b 100644 --- a/servers/omnisharp/Dockerfile +++ b/servers/omnisharp/Dockerfile @@ -3,10 +3,10 @@ FROM debian:12.11-slim WORKDIR /tmp RUN apt-get update \ - && apt-get install curl --no-install-recommends --yes \ - && apt-get reinstall ca-certificates --yes \ + && apt-get install curl=7.88.1-10+deb12u12 --no-install-recommends --yes \ + && apt-get reinstall ca-certificates=20230311+deb12u1 --yes \ && update-ca-certificates \ - && curl -L -O https://github.com/OmniSharp/omnisharp-roslyn/releases/download/v1.38.0/omnisharp-linux-x64.tar.gz \ + && curl -L -O https://github.com/OmniSharp/omnisharp-roslyn/releases/download/v1.39.12/omnisharp-linux-x64.tar.gz \ && tar -xf omnisharp-linux-x64.tar.gz -C /usr \ && rm omnisharp-linux-x64.tar.gz \ && apt-get clean \ diff --git a/servers/powershell_es/Dockerfile b/servers/powershell_es/Dockerfile index 2ce69a0..9b7e563 100644 --- a/servers/powershell_es/Dockerfile +++ b/servers/powershell_es/Dockerfile @@ -3,9 +3,9 @@ FROM mcr.microsoft.com/powershell:7.5-alpine-3.20 WORKDIR /srv RUN apk add --no-cache \ - curl \ - unzip \ - && curl -L -o PowerShellEditorServices.zip https://github.com/PowerShell/PowerShellEditorServices/releases/download/v3.4.8/PowerShellEditorServices.zip \ + curl=8.12.1-r0 \ + unzip=6.0-r14 \ + && curl -L -o PowerShellEditorServices.zip https://github.com/PowerShell/PowerShellEditorServices/releases/download/v3.26.0/PowerShellEditorServices.zip \ && unzip PowerShellEditorServices.zip \ && rm -fr PowerShellEditorServices.zip diff --git a/servers/prisma/Dockerfile b/servers/prisma/Dockerfile index b13ea41..07a318f 100644 --- a/servers/prisma/Dockerfile +++ b/servers/prisma/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - @prisma/language-server + @prisma/language-server@6.9.1 CMD [ "prisma-language-server", "--stdio" ] diff --git a/servers/pylsp/Dockerfile b/servers/pylsp/Dockerfile index 7ff965e..c64e608 100644 --- a/servers/pylsp/Dockerfile +++ b/servers/pylsp/Dockerfile @@ -1,20 +1,20 @@ FROM alpine:3.22.1 as build RUN apk add --no-cache \ - build-base \ - python3 \ - python3-dev \ - py3-pip \ + build-base=0.5-r3 \ + python3=3.12.11-r0 \ + python3-dev=3.12.11-r0 \ + py3-pip=25.1.1-r0 \ && python3 -m venv /venv WORKDIR /venv -RUN /venv/bin/pip install "python-lsp-server[all]" +RUN /venv/bin/pip install "python-lsp-server[all]==1.12.0" FROM alpine:3.22.1 -RUN apk add --no-cache python3 py3-pip +RUN apk add --no-cache python3=3.12.11-r0 py3-pip=25.1.1-r0 WORKDIR /venv diff --git a/servers/pyright/Dockerfile b/servers/pyright/Dockerfile index c535649..94e4ef9 100644 --- a/servers/pyright/Dockerfile +++ b/servers/pyright/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - pyright + pyright@1.1.377 CMD [ "pyright-langserver", "--stdio" ] diff --git a/servers/solargraph/Dockerfile b/servers/solargraph/Dockerfile index 792707f..598f49f 100644 --- a/servers/solargraph/Dockerfile +++ b/servers/solargraph/Dockerfile @@ -1,14 +1,14 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - g++ \ - gcc \ - git \ - make \ - ruby \ - ruby-dev \ - zlib-dev \ + g++=14.2.0-r6 \ + gcc=14.2.0-r6 \ + git=2.49.1-r0 \ + make=4.4.1-r3 \ + ruby=3.4.4-r0 \ + ruby-dev=3.4.4-r0 \ + zlib-dev=1.3.1-r2 \ && gem install \ - solargraph + solargraph -v 0.55.1 CMD [ "/usr/local/bundle/bin/solargraph", "stdio" ] diff --git a/servers/sumneko_lua/Dockerfile b/servers/sumneko_lua/Dockerfile index 9324b5d..aaacc39 100644 --- a/servers/sumneko_lua/Dockerfile +++ b/servers/sumneko_lua/Dockerfile @@ -1,5 +1,5 @@ FROM alpine:3.22.1 -RUN apk add --update --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ lua-language-server +RUN apk add --update --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ lua-language-server=3.14.0-r0 CMD [ "lua-language-server" ] diff --git a/servers/svelteserver/Dockerfile b/servers/svelteserver/Dockerfile index dfcfe82..8883a89 100644 --- a/servers/svelteserver/Dockerfile +++ b/servers/svelteserver/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - svelte-language-server + svelte-language-server@0.17.16 CMD [ "svelteserver", "--stdio" ] diff --git a/servers/tailwindcss/Dockerfile b/servers/tailwindcss/Dockerfile index dd272e3..193bf64 100644 --- a/servers/tailwindcss/Dockerfile +++ b/servers/tailwindcss/Dockerfile @@ -1,10 +1,10 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - tailwindcss \ - @tailwindcss/language-server + tailwindcss@4.1.11 \ + @tailwindcss/language-server@0.14.25 CMD ["tailwindcss-language-server", "--stdio"] diff --git a/servers/terraformls/Dockerfile b/servers/terraformls/Dockerfile index 8f95c66..ac40f52 100644 --- a/servers/terraformls/Dockerfile +++ b/servers/terraformls/Dockerfile @@ -1,12 +1,12 @@ FROM alpine:3.22.1 AS build -ARG TF_LS_VERSION=0.29.3 -ARG TF_VERSION=1.3.3 +ARG TF_LS_VERSION=0.36.0 +ARG TF_VERSION=1.10.0 RUN apk add --no-cache --virtual \ build-deps \ - curl \ - gnupg + curl=8.14.1-r1 \ + gnupg=2.4.7-r0 WORKDIR /build diff --git a/servers/tsserver/Dockerfile b/servers/tsserver/Dockerfile index e9695c3..b824b62 100644 --- a/servers/tsserver/Dockerfile +++ b/servers/tsserver/Dockerfile @@ -1,11 +1,11 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - typescript-language-server \ - @vue/typescript-plugin \ - typescript + typescript-language-server@4.3.4 \ + @vue/typescript-plugin@2.1.6 \ + typescript@5.5.4 CMD [ "typescript-language-server", "--stdio" ] diff --git a/servers/volar/Dockerfile b/servers/volar/Dockerfile index 963e92d..f8a6077 100644 --- a/servers/volar/Dockerfile +++ b/servers/volar/Dockerfile @@ -1,6 +1,6 @@ FROM alpine:3.22.1 -RUN apk add --no-cache nodejs npm +RUN apk add --no-cache nodejs=22.16.0-r2 npm=11.3.0-r0 ENV VERSION=1.8.11 diff --git a/servers/vuels/Dockerfile b/servers/vuels/Dockerfile index ce5ee59..06de80f 100644 --- a/servers/vuels/Dockerfile +++ b/servers/vuels/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - vls + vls@0.8.5 CMD [ "vls", "--stdio" ] diff --git a/servers/yamlls/Dockerfile b/servers/yamlls/Dockerfile index 7c6826d..453965c 100644 --- a/servers/yamlls/Dockerfile +++ b/servers/yamlls/Dockerfile @@ -1,9 +1,9 @@ FROM alpine:3.22.1 RUN apk add --no-cache \ - nodejs \ - npm \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ && npm install -g \ - yaml-language-server + yaml-language-server@1.18.0 CMD [ "yaml-language-server", "--stdio" ] From ae71554b6d8b9f420eae32b714d3dd877b8387d3 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:14:07 -0700 Subject: [PATCH 05/15] fix(terraformls): resolve unzip conflict and update versions - Add -o flag to unzip commands to overwrite files without prompting - Update terraform-ls to version 0.36.5 (was 0.36.0) - Update terraform to version 1.12.2 (was 1.10.0) This fixes the build failure caused by LICENSE.txt file conflicts when extracting both terraform-ls and terraform archives. --- servers/terraformls/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/servers/terraformls/Dockerfile b/servers/terraformls/Dockerfile index ac40f52..d03e795 100644 --- a/servers/terraformls/Dockerfile +++ b/servers/terraformls/Dockerfile @@ -1,7 +1,7 @@ FROM alpine:3.22.1 AS build -ARG TF_LS_VERSION=0.36.0 -ARG TF_VERSION=1.10.0 +ARG TF_LS_VERSION=0.36.5 +ARG TF_VERSION=1.12.2 RUN apk add --no-cache --virtual \ build-deps \ @@ -25,8 +25,8 @@ RUN curl --proto '=https' \ && gpg --verify terraform_${TF_VERSION}_SHA256SUMS.sig terraform_${TF_VERSION}_SHA256SUMS \ && sha256sum -c SHA256SUMS \ && sha256sum -c TERRAFORM_SHA256SUMS \ - && unzip terraform-ls_${TF_LS_VERSION}_linux_amd64.zip \ - && unzip terraform_${TF_VERSION}_linux_amd64.zip + && unzip -o terraform-ls_${TF_LS_VERSION}_linux_amd64.zip \ + && unzip -o terraform_${TF_VERSION}_linux_amd64.zip FROM alpine:3.22.1 From abd9924076c8b5e28d44b0238d86fa42c19218db Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:20:35 -0700 Subject: [PATCH 06/15] fix(powershell_es): update to latest PowerShell Editor Services version - Update PowerShell Editor Services from v3.26.0 to v4.3.0 - Remove deprecated version field from docker-compose.yaml The previous version v3.26.0 was not available, causing download failures. Updated to the latest stable release v4.3.0. --- docker-compose.yaml | 2 -- servers/powershell_es/Dockerfile | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 9bb80e1..ce69b7c 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,5 +1,3 @@ -version: "3.8" - services: bashls: image: lspcontainers/bash-language-server diff --git a/servers/powershell_es/Dockerfile b/servers/powershell_es/Dockerfile index 9b7e563..b0fefc2 100644 --- a/servers/powershell_es/Dockerfile +++ b/servers/powershell_es/Dockerfile @@ -5,7 +5,7 @@ WORKDIR /srv RUN apk add --no-cache \ curl=8.12.1-r0 \ unzip=6.0-r14 \ - && curl -L -o PowerShellEditorServices.zip https://github.com/PowerShell/PowerShellEditorServices/releases/download/v3.26.0/PowerShellEditorServices.zip \ + && curl -L -o PowerShellEditorServices.zip https://github.com/PowerShell/PowerShellEditorServices/releases/download/v4.3.0/PowerShellEditorServices.zip \ && unzip PowerShellEditorServices.zip \ && rm -fr PowerShellEditorServices.zip From f6b3aba03a759ff606b4b4743a43d53dace51c95 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:33:25 -0700 Subject: [PATCH 07/15] fix(gopls): update Go tools to latest stable versions - Update gopkgs from v2.3.0 to v2.1.2 (latest tagged release) - Update go-outline to specific commit hash (no tagged releases) - Update gotests from v1.6.3 to v1.6.0 (latest tagged release) - Update impl to v1.4.0 (latest tagged release) - Update delve from v1.24.2 to v1.25.0 (latest tagged release) - Update staticcheck from 2024.1.1 to 2025.1.1 (latest tagged release) - Update gopls from v0.17.0 to v0.19.1 (latest tagged release) This fixes build failures caused by invalid version references and ensures all Go development tools are at their latest stable versions. --- servers/gopls/Dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/servers/gopls/Dockerfile b/servers/gopls/Dockerfile index 88ab371..a4456b0 100644 --- a/servers/gopls/Dockerfile +++ b/servers/gopls/Dockerfile @@ -20,15 +20,15 @@ USER lspcontainers ENV GOBIN="/home/lspcontainers/.bin" ENV PATH="${GOBIN}:$PATH" -RUN go install github.com/uudashr/gopkgs/v2/cmd/gopkgs@v2.3.0 \ - && go install github.com/ramya-rao-a/go-outline@v0.0.0-20230705182323-5c2c3ef6aa00 \ - && go install github.com/cweill/gotests/gotests@v1.6.3 \ +RUN go install github.com/uudashr/gopkgs/v2/cmd/gopkgs@v2.1.2 \ + && go install github.com/ramya-rao-a/go-outline@9736a4bde949f321d201e5eaa5ae2bcde011bf00 \ + && go install github.com/cweill/gotests/gotests@v1.6.0 \ && go install github.com/fatih/gomodifytags@v1.17.0 \ && go install github.com/josharian/impl@v1.4.0 \ && go install github.com/haya14busa/goplay/cmd/goplay@v1.0.0 \ - && go install github.com/go-delve/delve/cmd/dlv@v1.24.2 \ - && go install honnef.co/go/tools/cmd/staticcheck@2024.1.1 \ - && go install golang.org/x/tools/gopls@v0.17.0 + && go install github.com/go-delve/delve/cmd/dlv@v1.25.0 \ + && go install honnef.co/go/tools/cmd/staticcheck@2025.1.1 \ + && go install golang.org/x/tools/gopls@v0.19.1 COPY --chown=lspcontainers:lspcontainers \ docker_entrypoint.sh /home/lspcontainers/docker_entrypoint.sh From 3e22a5f5392a5495be7166a07c031384602f4a7c Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:37:41 -0700 Subject: [PATCH 08/15] feat: revamp README.md to attract new contributors - Add comprehensive project overview with clear value proposition - Include professional badges for Docker Hub, build status, and license - Create detailed language server table with version badges - Add step-by-step contribution guide with code examples - Include usage examples for VS Code, Neovim, and CI/CD integration - Highlight architecture benefits (reproducible builds, security, automation) - Add development workflow instructions and project statistics - Transform from technical reference to welcoming community guide This makes the project more accessible and appealing to potential contributors while clearly communicating its value to developers. --- README.md | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 199 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 25d4ba9..847c86b 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,210 @@ -# dockerfiles +# lspcontainers/dockerfiles -Dockerfiles for all LSPs used with `lspcontainers`. +🚀 **Dockerfiles for Language Server Protocol (LSP) servers** - Making development environments consistent, portable, and easy to manage. -## Installation +[![Docker Hub](https://img.shields.io/badge/Docker%20Hub-lspcontainers-blue?logo=docker)](https://hub.docker.com/u/lspcontainers) +[![Build Status](https://img.shields.io/github/actions/workflow/status/lspcontainers/dockerfiles/build-image.yml?branch=main)](https://github.com/lspcontainers/dockerfiles/actions) +[![License](https://img.shields.io/github/license/lspcontainers/dockerfiles)](LICENSE) -This repository requires the latest: +## 🌟 What is this? -- [Docker Engine](https://docs.docker.com/engine/install/) -- [Docker Compose](https://docs.docker.com/compose/install) +This repository provides **production-ready Docker containers** for 25+ Language Server Protocol (LSP) servers, enabling you to run language servers in isolated, reproducible environments. Perfect for: -## Build +- **Consistent development environments** across teams +- **CI/CD pipelines** with reliable tooling +- **Remote development** with containerized language servers +- **Editor/IDE integration** without local language server installation -To build images locally run: +## 🛠️ Supported Language Servers -- `docker-compose build ` to build a specific server (see `docker-compose.yaml`) -- `docker-compose build` to build all servers -- `docker-compose build --parallel` to build all servers in parallel +| Language | Server | Container | Latest Version | +|----------|--------|-----------|----------------| +| **Bash** | bash-language-server | `lspcontainers/bash-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/bash-language-server?sort=semver) | +| **C/C++** | clangd | `lspcontainers/clangd-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/clangd-language-server?sort=semver) | +| **C#** | omnisharp | `lspcontainers/omnisharp-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/omnisharp-language-server?sort=semver) | +| **Docker** | dockerfile-ls | `lspcontainers/docker-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/docker-language-server?sort=semver) | +| **Go** | gopls | `lspcontainers/gopls` | ![Version](https://img.shields.io/docker/v/lspcontainers/gopls?sort=semver) | +| **HTML** | html-languageserver | `lspcontainers/html-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/html-language-server?sort=semver) | +| **JavaScript/TypeScript** | typescript-language-server | `lspcontainers/typescript-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/typescript-language-server?sort=semver) | +| **JSON** | vscode-json-languageserver | `lspcontainers/json-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/json-language-server?sort=semver) | +| **Lua** | lua-language-server | `lspcontainers/lua-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/lua-language-server?sort=semver) | +| **PHP** | intelephense | `lspcontainers/php-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/php-language-server?sort=semver) | +| **Python** | pylsp/pyright | `lspcontainers/python-lsp-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/python-lsp-server?sort=semver) | +| **Ruby** | solargraph | `lspcontainers/ruby-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/ruby-language-server?sort=semver) | +| **Rust** | rust-analyzer | `lspcontainers/rust-analyzer` | ![Version](https://img.shields.io/docker/v/lspcontainers/rust-analyzer?sort=semver) | +| **YAML** | yaml-language-server | `lspcontainers/yaml-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/yaml-language-server?sort=semver) | +| *And 10+ more...* | | | | -## Versions +## 🚀 Quick Start -Every container has two tags available: +### Using Pre-built Images -- The `latest` tag, which points to the latest container build +```bash +# Pull and run a language server +docker run -it lspcontainers/typescript-language-server -- A pinned version. The pinned version will be the latest - version of the language server. +# Use with your editor (example with neovim) +docker run -v $(pwd):/workspace lspcontainers/gopls +``` + +### Building Locally + +```bash +# Clone the repository +git clone https://github.com/lspcontainers/dockerfiles.git +cd dockerfiles + +# Build a specific server +docker-compose build typescript-language-server + +# Build all servers +docker-compose build + +# Build all servers in parallel (faster!) +docker-compose build --parallel +``` + +## 📋 Prerequisites + +- [Docker Engine](https://docs.docker.com/engine/install/) (20.10+) +- [Docker Compose](https://docs.docker.com/compose/install) (2.0+) + +## 🏗️ Architecture & Design + +### 🔒 **Reproducible Builds** +All containers use **pinned package versions** for complete reproducibility: +- **Base images**: Specific Alpine/Debian versions +- **System packages**: Exact apk/apt package versions +- **Language packages**: Pinned npm, gem, pip, go module versions + +### 🏔️ **Minimal & Secure** +- **Alpine Linux base** for minimal attack surface +- **Multi-stage builds** where applicable +- **Non-root users** for security +- **Distroless principles** - only essential components + +### 🔄 **Automated Updates** +- **Daily builds** via GitHub Actions +- **Dependency scanning** and security updates +- **Version tracking** of upstream language servers + +## 🤝 Contributing + +We're actively looking for contributors! Here's how you can help: + +### 🐛 **Report Issues** +Found a bug or have a feature request? [Open an issue](https://github.com/lspcontainers/dockerfiles/issues/new)! + +### 🔧 **Add New Language Servers** +Want to add support for a new language? We'd love your contribution! + +1. **Fork the repository** +2. **Create a new directory** under `servers/your-language-server/` +3. **Write a Dockerfile** following our patterns: + ```dockerfile + FROM alpine:3.22.1 + + RUN apk add --no-cache \ + nodejs=22.16.0-r2 \ + npm=11.3.0-r0 \ + && npm install -g \ + your-language-server@1.2.3 + + CMD [ "your-language-server", "--stdio" ] + ``` +4. **Add to docker-compose.yaml** +5. **Test your build**: `docker-compose build your-server` +6. **Submit a pull request** + +### 🛠️ **Improve Existing Containers** +- Update language server versions +- Improve Dockerfile efficiency +- Add missing tools or dependencies +- Enhance security + +### 📚 **Documentation** +- Improve README files +- Add usage examples +- Write integration guides +- Create tutorials + +## 🏷️ Container Versioning + +Every container provides two tags: + +- **`latest`** - Latest build from main branch +- **`vX.Y.Z`** - Pinned version of the language server + +```bash +# Always latest +docker pull lspcontainers/gopls:latest + +# Specific version for production +docker pull lspcontainers/gopls:v0.19.1 +``` + +## 📖 Usage Examples + +### **With VS Code** +```json +{ + "languageserver": { + "golang": { + "command": "docker", + "args": ["run", "-i", "--rm", "-v", "${workspaceFolder}:/workspace", "lspcontainers/gopls"], + "rootPatterns": ["go.mod", ".git/"], + "filetypes": ["go"] + } + } +} +``` + +### **With Neovim** +```lua +require('lspconfig').gopls.setup { + cmd = {"docker", "run", "-i", "--rm", "-v", vim.fn.getcwd() .. ":/workspace", "lspcontainers/gopls"} +} +``` + +### **CI/CD Integration** +```yaml +# GitHub Actions example +- name: Check Go code with gopls + run: | + docker run --rm -v ${{ github.workspace }}:/workspace \ + lspcontainers/gopls check /workspace +``` + +## 🔍 Development Workflow + +### Local Development +```bash +# Test a single container +make test-gopls + +# Lint all Dockerfiles +make lint + +# Build and test all containers +make test-all +``` + +### 📊 Project Stats + +- **25+ Language Servers** supported +- **Automated daily builds** ensuring freshness +- **100% reproducible builds** with pinned versions +- **Multi-architecture support** (amd64, arm64) +- **Active community** with regular contributions + +--- + +## 🎯 Why LSP Containers? + +**Before**: Install language servers locally, deal with version conflicts, environment setup headaches + +**After**: `docker run` and you're ready to code with any language server, anywhere + +--- + +**Ready to contribute?** Check out our [Contributing Guide](CONTRIBUTING.md) and join our community of developers making language servers more accessible! From ea76a285f8057f598bcf1357f876885ef8934313 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Wed, 16 Jul 2025 17:48:58 -0700 Subject: [PATCH 09/15] docs: refocus README on lspcontainers.nvim integration - Update description to emphasize containers are for lspcontainers.nvim plugin - Replace detailed setup instructions with link to plugin documentation - Simplify Quick Start section to direct users to plugin repo - Remove duplicate usage examples, point to plugin docs instead - Add complete language server table (27 servers) without version badges - Streamline content to avoid duplication between repositories - Better separation of concerns: containers here, usage in plugin repo This creates a cleaner user experience with single source of truth for setup instructions while keeping focus on container development. --- README.md | 108 ++++++++++++++++++++++++------------------------------ 1 file changed, 47 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index 847c86b..5728ea6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # lspcontainers/dockerfiles -🚀 **Dockerfiles for Language Server Protocol (LSP) servers** - Making development environments consistent, portable, and easy to manage. +🚀 **Dockerfiles for Language Server Protocol (LSP) servers** - Containerized language servers for use with [lspcontainers.nvim](https://github.com/lspcontainers/lspcontainers.nvim). [![Docker Hub](https://img.shields.io/badge/Docker%20Hub-lspcontainers-blue?logo=docker)](https://hub.docker.com/u/lspcontainers) [![Build Status](https://img.shields.io/github/actions/workflow/status/lspcontainers/dockerfiles/build-image.yml?branch=main)](https://github.com/lspcontainers/dockerfiles/actions) @@ -8,46 +8,60 @@ ## 🌟 What is this? -This repository provides **production-ready Docker containers** for 25+ Language Server Protocol (LSP) servers, enabling you to run language servers in isolated, reproducible environments. Perfect for: +This repository provides **production-ready Docker containers** for 25+ Language Server Protocol (LSP) servers, designed to work seamlessly with the **[lspcontainers.nvim](https://github.com/lspcontainers/lspcontainers.nvim)** Neovim plugin. -- **Consistent development environments** across teams -- **CI/CD pipelines** with reliable tooling -- **Remote development** with containerized language servers -- **Editor/IDE integration** without local language server installation +### 🎯 **How it works:** +1. **Docker containers** provide isolated, reproducible LSP server environments +2. **[lspcontainers.nvim](https://github.com/lspcontainers/lspcontainers.nvim)** plugin automatically manages these containers in Neovim +3. **Zero local installation** - no need to install language servers on your system + +Perfect for: +- **Consistent development environments** across teams and machines +- **Clean system** - no language server pollution on your host +- **Reproducible builds** with pinned package versions +- **Easy switching** between language server versions ## 🛠️ Supported Language Servers -| Language | Server | Container | Latest Version | -|----------|--------|-----------|----------------| -| **Bash** | bash-language-server | `lspcontainers/bash-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/bash-language-server?sort=semver) | -| **C/C++** | clangd | `lspcontainers/clangd-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/clangd-language-server?sort=semver) | -| **C#** | omnisharp | `lspcontainers/omnisharp-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/omnisharp-language-server?sort=semver) | -| **Docker** | dockerfile-ls | `lspcontainers/docker-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/docker-language-server?sort=semver) | -| **Go** | gopls | `lspcontainers/gopls` | ![Version](https://img.shields.io/docker/v/lspcontainers/gopls?sort=semver) | -| **HTML** | html-languageserver | `lspcontainers/html-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/html-language-server?sort=semver) | -| **JavaScript/TypeScript** | typescript-language-server | `lspcontainers/typescript-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/typescript-language-server?sort=semver) | -| **JSON** | vscode-json-languageserver | `lspcontainers/json-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/json-language-server?sort=semver) | -| **Lua** | lua-language-server | `lspcontainers/lua-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/lua-language-server?sort=semver) | -| **PHP** | intelephense | `lspcontainers/php-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/php-language-server?sort=semver) | -| **Python** | pylsp/pyright | `lspcontainers/python-lsp-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/python-lsp-server?sort=semver) | -| **Ruby** | solargraph | `lspcontainers/ruby-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/ruby-language-server?sort=semver) | -| **Rust** | rust-analyzer | `lspcontainers/rust-analyzer` | ![Version](https://img.shields.io/docker/v/lspcontainers/rust-analyzer?sort=semver) | -| **YAML** | yaml-language-server | `lspcontainers/yaml-language-server` | ![Version](https://img.shields.io/docker/v/lspcontainers/yaml-language-server?sort=semver) | -| *And 10+ more...* | | | | +| Language | Server | Container | +|----------|--------|-----------| +| **Bash** | bash-language-server | `lspcontainers/bash-language-server` | +| **C/C++** | clangd | `lspcontainers/clangd-language-server` | +| **C#** | omnisharp | `lspcontainers/omnisharp-language-server` | +| **CSS/SCSS/Less** | vscode-css-languageserver | `lspcontainers/css-language-server` | +| **Deno** | deno-lsp | `lspcontainers/deno-language-server` | +| **Docker** | dockerfile-ls | `lspcontainers/docker-language-server` | +| **ESLint** | eslint-languageserver | `lspcontainers/eslint-language-server` | +| **Go** | gopls | `lspcontainers/gopls` | +| **GraphQL** | graphql-language-service | `lspcontainers/graphql-language-server` | +| **HTML** | html-languageserver | `lspcontainers/html-language-server` | +| **JavaScript/TypeScript** | typescript-language-server | `lspcontainers/typescript-language-server` | +| **JSON** | vscode-json-languageserver | `lspcontainers/json-language-server` | +| **Lua** | lua-language-server | `lspcontainers/lua-language-server` | +| **PHP** | intelephense | `lspcontainers/php-language-server` | +| **PowerShell** | powershell-es | `lspcontainers/powershell-language-server` | +| **Prisma** | prisma-language-server | `lspcontainers/prisma-language-server` | +| **Python** | pylsp | `lspcontainers/python-lsp-server` | +| **Python** | pyright | `lspcontainers/pyright-language-server` | +| **Ruby** | solargraph | `lspcontainers/ruby-language-server` | +| **Rust** | rust-analyzer | `lspcontainers/rust-analyzer` | +| **Svelte** | svelte-language-server | `lspcontainers/svelte-language-server` | +| **Tailwind CSS** | tailwindcss-language-server | `lspcontainers/tailwindcss-language-server` | +| **Terraform** | terraform-ls | `lspcontainers/terraform-ls` | +| **Vue** | volar | `lspcontainers/volar-language-server` | +| **Vue** | vuels (legacy) | `lspcontainers/vue-language-server` | +| **XML** | lemminx | `lspcontainers/xml-language-server` | +| **YAML** | yaml-language-server | `lspcontainers/yaml-language-server` | ## 🚀 Quick Start -### Using Pre-built Images +### Using with lspcontainers.nvim (Recommended) -```bash -# Pull and run a language server -docker run -it lspcontainers/typescript-language-server +These containers are designed to work with the **[lspcontainers.nvim](https://github.com/lspcontainers/lspcontainers.nvim)** plugin. -# Use with your editor (example with neovim) -docker run -v $(pwd):/workspace lspcontainers/gopls -``` +👉 **[See the plugin documentation](https://github.com/lspcontainers/lspcontainers.nvim)** for installation and setup instructions. -### Building Locally +### Building Containers Locally ```bash # Clone the repository @@ -55,7 +69,7 @@ git clone https://github.com/lspcontainers/dockerfiles.git cd dockerfiles # Build a specific server -docker-compose build typescript-language-server +docker-compose build gopls # Build all servers docker-compose build @@ -145,35 +159,7 @@ docker pull lspcontainers/gopls:v0.19.1 ## 📖 Usage Examples -### **With VS Code** -```json -{ - "languageserver": { - "golang": { - "command": "docker", - "args": ["run", "-i", "--rm", "-v", "${workspaceFolder}:/workspace", "lspcontainers/gopls"], - "rootPatterns": ["go.mod", ".git/"], - "filetypes": ["go"] - } - } -} -``` - -### **With Neovim** -```lua -require('lspconfig').gopls.setup { - cmd = {"docker", "run", "-i", "--rm", "-v", vim.fn.getcwd() .. ":/workspace", "lspcontainers/gopls"} -} -``` - -### **CI/CD Integration** -```yaml -# GitHub Actions example -- name: Check Go code with gopls - run: | - docker run --rm -v ${{ github.workspace }}:/workspace \ - lspcontainers/gopls check /workspace -``` +For configuration examples and advanced usage, see the **[lspcontainers.nvim documentation](https://github.com/lspcontainers/lspcontainers.nvim)**. ## 🔍 Development Workflow From 1fbafbd0621431aca44a36bf3d747b29550cbde1 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Thu, 17 Jul 2025 11:47:45 -0700 Subject: [PATCH 10/15] feat: implement version tagging system for Docker images - Add ARG VERSION and LABEL version to all Dockerfiles - Update GitHub Actions to extract version from ARG VERSION line - Add debugging output to show exact tags used in builds - Convert hardcoded versions to use ${VERSION} variables - Update README.md with Dockerfile versioning documentation Each Docker image now gets tagged with both 'latest' and the specific language server version (e.g., gopls:latest and gopls:0.19.1). --- .github/workflows/build-and-push.yml | 16 ++++++++- README.md | 53 ++++++++++++++++++++++------ servers/bashls/Dockerfile | 5 ++- servers/clangd/Dockerfile | 5 ++- servers/denols/Dockerfile | 3 ++ servers/dockerls/Dockerfile | 5 ++- servers/eslintls/Dockerfile | 3 ++ servers/gopls/Dockerfile | 5 ++- servers/graphql-lsp/Dockerfile | 5 ++- servers/html/Dockerfile | 5 ++- servers/intelephense/Dockerfile | 5 ++- servers/jsonls/Dockerfile | 5 ++- servers/lemminx/Dockerfile | 5 ++- servers/omnisharp/Dockerfile | 5 ++- servers/powershell_es/Dockerfile | 5 ++- servers/prisma/Dockerfile | 5 ++- servers/pylsp/Dockerfile | 5 ++- servers/pyright/Dockerfile | 5 ++- servers/rust_analyzer/Dockerfile | 6 +++- servers/solargraph/Dockerfile | 5 ++- servers/sumneko_lua/Dockerfile | 5 ++- servers/svelteserver/Dockerfile | 5 ++- servers/tailwindcss/Dockerfile | 5 ++- servers/terraformls/Dockerfile | 4 ++- servers/tsserver/Dockerfile | 5 ++- servers/volar/Dockerfile | 7 ++-- servers/vuels/Dockerfile | 5 ++- servers/yamlls/Dockerfile | 5 ++- 28 files changed, 159 insertions(+), 38 deletions(-) diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml index 4348aa1..fa785d1 100644 --- a/.github/workflows/build-and-push.yml +++ b/.github/workflows/build-and-push.yml @@ -118,9 +118,23 @@ jobs: password: ${{ secrets.DOCKER_PASSWORD }} if: ${{ github.ref == 'refs/heads/main' }} + - name: Extract version from Dockerfile + id: version + run: | + VERSION=$(grep "ARG VERSION=" servers/${{ matrix.context }}/Dockerfile | cut -d'=' -f2 || echo "unknown") + echo "version=$VERSION" >> $GITHUB_OUTPUT + if [ "$VERSION" != "unknown" ]; then + TAGS="lspcontainers/${{ matrix.tag }}:latest,lspcontainers/${{ matrix.tag }}:$VERSION" + echo "tags=$TAGS" >> $GITHUB_OUTPUT + else + TAGS="lspcontainers/${{ matrix.tag }}:latest" + echo "tags=$TAGS" >> $GITHUB_OUTPUT + fi + echo "🏷️ Tags that will be used: $TAGS" + - name: Build and push to Docker Hub uses: docker/build-push-action@v5 with: context: servers/${{ matrix.context }} push: ${{ github.ref == 'refs/heads/main' }} - tags: lspcontainers/${{ matrix.tag }}:latest + tags: ${{ steps.version.outputs.tags }} diff --git a/README.md b/README.md index 5728ea6..a883ad8 100644 --- a/README.md +++ b/README.md @@ -117,13 +117,16 @@ Want to add support for a new language? We'd love your contribution! 3. **Write a Dockerfile** following our patterns: ```dockerfile FROM alpine:3.22.1 - + + ARG VERSION=1.2.3 + LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - your-language-server@1.2.3 - + your-language-server@${VERSION} + CMD [ "your-language-server", "--stdio" ] ``` 4. **Add to docker-compose.yaml** @@ -157,6 +160,42 @@ docker pull lspcontainers/gopls:latest docker pull lspcontainers/gopls:v0.19.1 ``` +### 🔄 **Updating Dockerfile Versions** + +Each Dockerfile includes version information that controls both the language server version and container tagging: + +```dockerfile +# Version is declared at the top +ARG VERSION=1.2.3 +LABEL version="${VERSION}" + +# Version variable is used in installation +RUN npm install -g your-language-server@${VERSION} +``` + +**To update a language server version:** + +1. **Edit the Dockerfile** in `servers/your-server/Dockerfile` +2. **Update the VERSION argument** to the new version +3. **Test the build** locally: `docker-compose build your-server` +4. **Submit a pull request** with your changes + +The CI/CD pipeline automatically: +- Extracts the version from the `LABEL version` directive +- Tags the image with both `latest` and the specific version +- Pushes to Docker Hub with proper versioning + +**Example version update:** +```dockerfile +# Before +ARG VERSION=1.2.3 + +# After +ARG VERSION=1.3.0 +``` + +This ensures reproducible builds and allows users to pin to specific language server versions. + ## 📖 Usage Examples For configuration examples and advanced usage, see the **[lspcontainers.nvim documentation](https://github.com/lspcontainers/lspcontainers.nvim)**. @@ -185,12 +224,4 @@ make test-all --- -## 🎯 Why LSP Containers? - -**Before**: Install language servers locally, deal with version conflicts, environment setup headaches - -**After**: `docker run` and you're ready to code with any language server, anywhere - ---- - **Ready to contribute?** Check out our [Contributing Guide](CONTRIBUTING.md) and join our community of developers making language servers more accessible! diff --git a/servers/bashls/Dockerfile b/servers/bashls/Dockerfile index 8a447af..94496f8 100644 --- a/servers/bashls/Dockerfile +++ b/servers/bashls/Dockerfile @@ -1,5 +1,8 @@ FROM alpine:3.22.1 +ARG VERSION=5.6.0 +LABEL version="${VERSION}" + # using npm breaks shellcheck download of its binary from api.github.com # running shellcheck -V forces it to download its binary during build RUN apk add --no-cache \ @@ -7,7 +10,7 @@ RUN apk add --no-cache \ yarn=1.22.22-r1 \ && yarn global add \ shellcheck@3.1.0 \ - bash-language-server@5.6.0 \ + bash-language-server@${VERSION} \ && shellcheck -V CMD [ "bash-language-server", "start" ] diff --git a/servers/clangd/Dockerfile b/servers/clangd/Dockerfile index 2307b05..4745f65 100644 --- a/servers/clangd/Dockerfile +++ b/servers/clangd/Dockerfile @@ -1,7 +1,10 @@ FROM alpine:3.22.1 +ARG VERSION=20.1.8 +LABEL version="${VERSION}" + RUN apk add --no-cache \ build-base=0.5-r3 \ - clang-extra-tools=20.1.8-r0 + clang-extra-tools=${VERSION}-r0 CMD [ "clangd", "--background-index" ] diff --git a/servers/denols/Dockerfile b/servers/denols/Dockerfile index 1b318b1..d8922e7 100644 --- a/servers/denols/Dockerfile +++ b/servers/denols/Dockerfile @@ -1,3 +1,6 @@ FROM denoland/deno:alpine-2.4.2 +ARG VERSION=2.4.2 +LABEL version="${VERSION}" + CMD [ "lsp" ] diff --git a/servers/dockerls/Dockerfile b/servers/dockerls/Dockerfile index dba43f6..c21d9d8 100644 --- a/servers/dockerls/Dockerfile +++ b/servers/dockerls/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=0.14.0 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - dockerfile-language-server-nodejs@0.14.0 + dockerfile-language-server-nodejs@${VERSION} CMD [ "docker-langserver", "--stdio" ] diff --git a/servers/eslintls/Dockerfile b/servers/eslintls/Dockerfile index 0ddc792..efc5485 100644 --- a/servers/eslintls/Dockerfile +++ b/servers/eslintls/Dockerfile @@ -1,5 +1,8 @@ FROM alpine:3.22.1 +ARG VERSION=latest +LABEL version="${VERSION}" + RUN apk add --no-cache \ git=2.49.1-r0 \ nodejs=22.16.0-r2 \ diff --git a/servers/gopls/Dockerfile b/servers/gopls/Dockerfile index a4456b0..57116ca 100644 --- a/servers/gopls/Dockerfile +++ b/servers/gopls/Dockerfile @@ -1,5 +1,8 @@ FROM alpine:3.22.1 +ARG VERSION=0.19.1 +LABEL version="${VERSION}" + RUN apk add --no-cache \ bash=5.2.37-r0 \ git=2.49.1-r0 \ @@ -28,7 +31,7 @@ RUN go install github.com/uudashr/gopkgs/v2/cmd/gopkgs@v2.1.2 \ && go install github.com/haya14busa/goplay/cmd/goplay@v1.0.0 \ && go install github.com/go-delve/delve/cmd/dlv@v1.25.0 \ && go install honnef.co/go/tools/cmd/staticcheck@2025.1.1 \ - && go install golang.org/x/tools/gopls@v0.19.1 + && go install golang.org/x/tools/gopls@v${VERSION} COPY --chown=lspcontainers:lspcontainers \ docker_entrypoint.sh /home/lspcontainers/docker_entrypoint.sh diff --git a/servers/graphql-lsp/Dockerfile b/servers/graphql-lsp/Dockerfile index 0d02810..cddf775 100644 --- a/servers/graphql-lsp/Dockerfile +++ b/servers/graphql-lsp/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=3.5.0 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - graphql-language-service-cli@3.5.0 + graphql-language-service-cli@${VERSION} CMD [ "graphql-lsp", "server" , "-m", "stream" ] diff --git a/servers/html/Dockerfile b/servers/html/Dockerfile index 24d90d0..995e2aa 100644 --- a/servers/html/Dockerfile +++ b/servers/html/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=1.4.0 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - vscode-html-languageserver-bin@1.4.0 + vscode-html-languageserver-bin@${VERSION} CMD [ "html-languageserver", "--stdio" ] diff --git a/servers/intelephense/Dockerfile b/servers/intelephense/Dockerfile index ab86ed0..98c89be 100644 --- a/servers/intelephense/Dockerfile +++ b/servers/intelephense/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=1.14.4 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - intelephense@1.14.4 + intelephense@${VERSION} CMD [ "intelephense", "--stdio" ] diff --git a/servers/jsonls/Dockerfile b/servers/jsonls/Dockerfile index 46842c6..c03af3d 100644 --- a/servers/jsonls/Dockerfile +++ b/servers/jsonls/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=4.10.0 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - vscode-langservers-extracted@4.10.0 + vscode-langservers-extracted@${VERSION} CMD [ "vscode-json-language-server", "--stdio" ] diff --git a/servers/lemminx/Dockerfile b/servers/lemminx/Dockerfile index f468a6e..3b7036e 100644 --- a/servers/lemminx/Dockerfile +++ b/servers/lemminx/Dockerfile @@ -1,6 +1,9 @@ FROM debian:12.11-slim # The binary requires gnu-libc and will not work on alpine +ARG VERSION=0.27.0 +LABEL version="${VERSION}" + WORKDIR /tmp ENV DEBIAN_FRONTEND=noninteractive @@ -11,7 +14,7 @@ RUN apt-get update -y \ ca-certificates=20230311+deb12u1 \ unzip=6.0-28 \ && update-ca-certificates \ -&& curl -sL -O https://github.com/redhat-developer/vscode-xml/releases/download/0.27.0/lemminx-linux.zip \ +&& curl -sL -O https://github.com/redhat-developer/vscode-xml/releases/download/${VERSION}/lemminx-linux.zip \ && unzip lemminx-linux.zip \ && rm -rf lemminx-linux.zip \ && apt-get remove curl unzip -y \ diff --git a/servers/omnisharp/Dockerfile b/servers/omnisharp/Dockerfile index d39824b..d0d844b 100644 --- a/servers/omnisharp/Dockerfile +++ b/servers/omnisharp/Dockerfile @@ -1,12 +1,15 @@ FROM debian:12.11-slim +ARG VERSION=1.39.12 +LABEL version="${VERSION}" + WORKDIR /tmp RUN apt-get update \ && apt-get install curl=7.88.1-10+deb12u12 --no-install-recommends --yes \ && apt-get reinstall ca-certificates=20230311+deb12u1 --yes \ && update-ca-certificates \ - && curl -L -O https://github.com/OmniSharp/omnisharp-roslyn/releases/download/v1.39.12/omnisharp-linux-x64.tar.gz \ + && curl -L -O https://github.com/OmniSharp/omnisharp-roslyn/releases/download/v${VERSION}/omnisharp-linux-x64.tar.gz \ && tar -xf omnisharp-linux-x64.tar.gz -C /usr \ && rm omnisharp-linux-x64.tar.gz \ && apt-get clean \ diff --git a/servers/powershell_es/Dockerfile b/servers/powershell_es/Dockerfile index b0fefc2..1d36697 100644 --- a/servers/powershell_es/Dockerfile +++ b/servers/powershell_es/Dockerfile @@ -1,11 +1,14 @@ FROM mcr.microsoft.com/powershell:7.5-alpine-3.20 +ARG VERSION=4.3.0 +LABEL version="${VERSION}" + WORKDIR /srv RUN apk add --no-cache \ curl=8.12.1-r0 \ unzip=6.0-r14 \ - && curl -L -o PowerShellEditorServices.zip https://github.com/PowerShell/PowerShellEditorServices/releases/download/v4.3.0/PowerShellEditorServices.zip \ + && curl -L -o PowerShellEditorServices.zip https://github.com/PowerShell/PowerShellEditorServices/releases/download/v${VERSION}/PowerShellEditorServices.zip \ && unzip PowerShellEditorServices.zip \ && rm -fr PowerShellEditorServices.zip diff --git a/servers/prisma/Dockerfile b/servers/prisma/Dockerfile index 07a318f..7a66cad 100644 --- a/servers/prisma/Dockerfile +++ b/servers/prisma/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=6.9.1 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - @prisma/language-server@6.9.1 + @prisma/language-server@${VERSION} CMD [ "prisma-language-server", "--stdio" ] diff --git a/servers/pylsp/Dockerfile b/servers/pylsp/Dockerfile index c64e608..5b9e338 100644 --- a/servers/pylsp/Dockerfile +++ b/servers/pylsp/Dockerfile @@ -1,5 +1,8 @@ FROM alpine:3.22.1 as build +ARG VERSION=1.12.0 +LABEL version="${VERSION}" + RUN apk add --no-cache \ build-base=0.5-r3 \ python3=3.12.11-r0 \ @@ -9,7 +12,7 @@ RUN apk add --no-cache \ WORKDIR /venv -RUN /venv/bin/pip install "python-lsp-server[all]==1.12.0" +RUN /venv/bin/pip install "python-lsp-server[all]==${VERSION}" FROM alpine:3.22.1 diff --git a/servers/pyright/Dockerfile b/servers/pyright/Dockerfile index 94e4ef9..455f79b 100644 --- a/servers/pyright/Dockerfile +++ b/servers/pyright/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=1.1.377 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - pyright@1.1.377 + pyright@${VERSION} CMD [ "pyright-langserver", "--stdio" ] diff --git a/servers/rust_analyzer/Dockerfile b/servers/rust_analyzer/Dockerfile index c83d9d2..4ce6f2b 100644 --- a/servers/rust_analyzer/Dockerfile +++ b/servers/rust_analyzer/Dockerfile @@ -1,4 +1,8 @@ -FROM rust:1.88.0-alpine3.22 +ARG VERSION=1.88.0 + +FROM rust:${VERSION}-alpine3.22 + +LABEL version="${VERSION}" RUN rustup component add rust-analyzer diff --git a/servers/solargraph/Dockerfile b/servers/solargraph/Dockerfile index 598f49f..5599ece 100644 --- a/servers/solargraph/Dockerfile +++ b/servers/solargraph/Dockerfile @@ -1,5 +1,8 @@ FROM alpine:3.22.1 +ARG VERSION=0.55.1 +LABEL version="${VERSION}" + RUN apk add --no-cache \ g++=14.2.0-r6 \ gcc=14.2.0-r6 \ @@ -9,6 +12,6 @@ RUN apk add --no-cache \ ruby-dev=3.4.4-r0 \ zlib-dev=1.3.1-r2 \ && gem install \ - solargraph -v 0.55.1 + solargraph -v ${VERSION} CMD [ "/usr/local/bundle/bin/solargraph", "stdio" ] diff --git a/servers/sumneko_lua/Dockerfile b/servers/sumneko_lua/Dockerfile index aaacc39..5f2a50b 100644 --- a/servers/sumneko_lua/Dockerfile +++ b/servers/sumneko_lua/Dockerfile @@ -1,5 +1,8 @@ FROM alpine:3.22.1 -RUN apk add --update --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ lua-language-server=3.14.0-r0 +ARG VERSION=3.14.0 +LABEL version="${VERSION}" + +RUN apk add --update --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ lua-language-server=${VERSION}-r0 CMD [ "lua-language-server" ] diff --git a/servers/svelteserver/Dockerfile b/servers/svelteserver/Dockerfile index 8883a89..a06ef36 100644 --- a/servers/svelteserver/Dockerfile +++ b/servers/svelteserver/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=0.17.16 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - svelte-language-server@0.17.16 + svelte-language-server@${VERSION} CMD [ "svelteserver", "--stdio" ] diff --git a/servers/tailwindcss/Dockerfile b/servers/tailwindcss/Dockerfile index 193bf64..8524971 100644 --- a/servers/tailwindcss/Dockerfile +++ b/servers/tailwindcss/Dockerfile @@ -1,10 +1,13 @@ FROM alpine:3.22.1 +ARG VERSION=0.14.25 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ tailwindcss@4.1.11 \ - @tailwindcss/language-server@0.14.25 + @tailwindcss/language-server@${VERSION} CMD ["tailwindcss-language-server", "--stdio"] diff --git a/servers/terraformls/Dockerfile b/servers/terraformls/Dockerfile index d03e795..e1ec355 100644 --- a/servers/terraformls/Dockerfile +++ b/servers/terraformls/Dockerfile @@ -1,7 +1,9 @@ FROM alpine:3.22.1 AS build -ARG TF_LS_VERSION=0.36.5 +ARG VERSION=0.36.5 +ARG TF_LS_VERSION=${VERSION} ARG TF_VERSION=1.12.2 +LABEL version="${VERSION}" RUN apk add --no-cache --virtual \ build-deps \ diff --git a/servers/tsserver/Dockerfile b/servers/tsserver/Dockerfile index b824b62..35bc380 100644 --- a/servers/tsserver/Dockerfile +++ b/servers/tsserver/Dockerfile @@ -1,10 +1,13 @@ FROM alpine:3.22.1 +ARG VERSION=4.3.4 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - typescript-language-server@4.3.4 \ + typescript-language-server@${VERSION} \ @vue/typescript-plugin@2.1.6 \ typescript@5.5.4 diff --git a/servers/volar/Dockerfile b/servers/volar/Dockerfile index f8a6077..bc3e4c1 100644 --- a/servers/volar/Dockerfile +++ b/servers/volar/Dockerfile @@ -1,9 +1,10 @@ FROM alpine:3.22.1 -RUN apk add --no-cache nodejs=22.16.0-r2 npm=11.3.0-r0 +ARG VERSION=1.8.11 +LABEL version="${VERSION}" -ENV VERSION=1.8.11 +RUN apk add --no-cache nodejs=22.16.0-r2 npm=11.3.0-r0 -RUN npm install -g @vue/language-server@$VERSION +RUN npm install -g @vue/language-server@${VERSION} CMD [ "vue-language-server", "--stdio" ] diff --git a/servers/vuels/Dockerfile b/servers/vuels/Dockerfile index 06de80f..6f42b34 100644 --- a/servers/vuels/Dockerfile +++ b/servers/vuels/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=0.8.5 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - vls@0.8.5 + vls@${VERSION} CMD [ "vls", "--stdio" ] diff --git a/servers/yamlls/Dockerfile b/servers/yamlls/Dockerfile index 453965c..71b1310 100644 --- a/servers/yamlls/Dockerfile +++ b/servers/yamlls/Dockerfile @@ -1,9 +1,12 @@ FROM alpine:3.22.1 +ARG VERSION=1.18.0 +LABEL version="${VERSION}" + RUN apk add --no-cache \ nodejs=22.16.0-r2 \ npm=11.3.0-r0 \ && npm install -g \ - yaml-language-server@1.18.0 + yaml-language-server@${VERSION} CMD [ "yaml-language-server", "--stdio" ] From ee38a86183f767ccba9791e8020b95346f5ba041 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Thu, 17 Jul 2025 11:55:48 -0700 Subject: [PATCH 11/15] fix(lint) --- servers/volar/Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/servers/volar/Dockerfile b/servers/volar/Dockerfile index bc3e4c1..6d45f14 100644 --- a/servers/volar/Dockerfile +++ b/servers/volar/Dockerfile @@ -3,8 +3,7 @@ FROM alpine:3.22.1 ARG VERSION=1.8.11 LABEL version="${VERSION}" -RUN apk add --no-cache nodejs=22.16.0-r2 npm=11.3.0-r0 - -RUN npm install -g @vue/language-server@${VERSION} +RUN apk add --no-cache nodejs=22.16.0-r2 npm=11.3.0-r0 && \ + npm install -g @vue/language-server@${VERSION} CMD [ "vue-language-server", "--stdio" ] From b11a0e0416171c97d2d39b058367acfa257d6353 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:23:29 -0700 Subject: [PATCH 12/15] docs: add version badges to language servers table - Add Version column to supported language servers table - Show current language server versions from Dockerfiles - Use shields.io badges for consistent visual styling - Help users identify specific versions available in containers --- README.md | 58 +++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index a883ad8..a016383 100644 --- a/README.md +++ b/README.md @@ -23,35 +23,35 @@ Perfect for: ## 🛠️ Supported Language Servers -| Language | Server | Container | -|----------|--------|-----------| -| **Bash** | bash-language-server | `lspcontainers/bash-language-server` | -| **C/C++** | clangd | `lspcontainers/clangd-language-server` | -| **C#** | omnisharp | `lspcontainers/omnisharp-language-server` | -| **CSS/SCSS/Less** | vscode-css-languageserver | `lspcontainers/css-language-server` | -| **Deno** | deno-lsp | `lspcontainers/deno-language-server` | -| **Docker** | dockerfile-ls | `lspcontainers/docker-language-server` | -| **ESLint** | eslint-languageserver | `lspcontainers/eslint-language-server` | -| **Go** | gopls | `lspcontainers/gopls` | -| **GraphQL** | graphql-language-service | `lspcontainers/graphql-language-server` | -| **HTML** | html-languageserver | `lspcontainers/html-language-server` | -| **JavaScript/TypeScript** | typescript-language-server | `lspcontainers/typescript-language-server` | -| **JSON** | vscode-json-languageserver | `lspcontainers/json-language-server` | -| **Lua** | lua-language-server | `lspcontainers/lua-language-server` | -| **PHP** | intelephense | `lspcontainers/php-language-server` | -| **PowerShell** | powershell-es | `lspcontainers/powershell-language-server` | -| **Prisma** | prisma-language-server | `lspcontainers/prisma-language-server` | -| **Python** | pylsp | `lspcontainers/python-lsp-server` | -| **Python** | pyright | `lspcontainers/pyright-language-server` | -| **Ruby** | solargraph | `lspcontainers/ruby-language-server` | -| **Rust** | rust-analyzer | `lspcontainers/rust-analyzer` | -| **Svelte** | svelte-language-server | `lspcontainers/svelte-language-server` | -| **Tailwind CSS** | tailwindcss-language-server | `lspcontainers/tailwindcss-language-server` | -| **Terraform** | terraform-ls | `lspcontainers/terraform-ls` | -| **Vue** | volar | `lspcontainers/volar-language-server` | -| **Vue** | vuels (legacy) | `lspcontainers/vue-language-server` | -| **XML** | lemminx | `lspcontainers/xml-language-server` | -| **YAML** | yaml-language-server | `lspcontainers/yaml-language-server` | +| Language | Server | Container | Version | +|----------|--------|-----------|---------| +| **Bash** | bash-language-server | `lspcontainers/bash-language-server` | ![Version](https://img.shields.io/badge/version-5.6.0-blue) | +| **C/C++** | clangd | `lspcontainers/clangd-language-server` | ![Version](https://img.shields.io/badge/version-20.1.8-blue) | +| **C#** | omnisharp | `lspcontainers/omnisharp-language-server` | ![Version](https://img.shields.io/badge/version-1.39.12-blue) | +| **CSS/SCSS/Less** | vscode-css-languageserver | `lspcontainers/css-language-server` | ![Version](https://img.shields.io/badge/version-4.10.0-blue) | +| **Deno** | deno-lsp | `lspcontainers/deno-language-server` | ![Version](https://img.shields.io/badge/version-2.4.2-blue) | +| **Docker** | dockerfile-ls | `lspcontainers/docker-language-server` | ![Version](https://img.shields.io/badge/version-0.14.0-blue) | +| **ESLint** | eslint-languageserver | `lspcontainers/eslint-language-server` | ![Version](https://img.shields.io/badge/version-latest-blue) | +| **Go** | gopls | `lspcontainers/gopls` | ![Version](https://img.shields.io/badge/version-0.19.1-blue) | +| **GraphQL** | graphql-language-service | `lspcontainers/graphql-language-server` | ![Version](https://img.shields.io/badge/version-3.5.0-blue) | +| **HTML** | html-languageserver | `lspcontainers/html-language-server` | ![Version](https://img.shields.io/badge/version-1.4.0-blue) | +| **JavaScript/TypeScript** | typescript-language-server | `lspcontainers/typescript-language-server` | ![Version](https://img.shields.io/badge/version-4.3.4-blue) | +| **JSON** | vscode-json-languageserver | `lspcontainers/json-language-server` | ![Version](https://img.shields.io/badge/version-4.10.0-blue) | +| **Lua** | lua-language-server | `lspcontainers/lua-language-server` | ![Version](https://img.shields.io/badge/version-3.14.0-blue) | +| **PHP** | intelephense | `lspcontainers/php-language-server` | ![Version](https://img.shields.io/badge/version-1.14.4-blue) | +| **PowerShell** | powershell-es | `lspcontainers/powershell-language-server` | ![Version](https://img.shields.io/badge/version-4.3.0-blue) | +| **Prisma** | prisma-language-server | `lspcontainers/prisma-language-server` | ![Version](https://img.shields.io/badge/version-6.9.1-blue) | +| **Python** | pylsp | `lspcontainers/python-lsp-server` | ![Version](https://img.shields.io/badge/version-1.12.0-blue) | +| **Python** | pyright | `lspcontainers/pyright-language-server` | ![Version](https://img.shields.io/badge/version-1.1.377-blue) | +| **Ruby** | solargraph | `lspcontainers/ruby-language-server` | ![Version](https://img.shields.io/badge/version-0.55.1-blue) | +| **Rust** | rust-analyzer | `lspcontainers/rust-analyzer` | ![Version](https://img.shields.io/badge/version-1.88.0-blue) | +| **Svelte** | svelte-language-server | `lspcontainers/svelte-language-server` | ![Version](https://img.shields.io/badge/version-0.17.16-blue) | +| **Tailwind CSS** | tailwindcss-language-server | `lspcontainers/tailwindcss-language-server` | ![Version](https://img.shields.io/badge/version-0.14.25-blue) | +| **Terraform** | terraform-ls | `lspcontainers/terraform-ls` | ![Version](https://img.shields.io/badge/version-0.36.5-blue) | +| **Vue** | volar | `lspcontainers/volar-language-server` | ![Version](https://img.shields.io/badge/version-1.8.11-blue) | +| **Vue** | vuels (legacy) | `lspcontainers/vue-language-server` | ![Version](https://img.shields.io/badge/version-0.8.5-blue) | +| **XML** | lemminx | `lspcontainers/xml-language-server` | ![Version](https://img.shields.io/badge/version-0.27.0-blue) | +| **YAML** | yaml-language-server | `lspcontainers/yaml-language-server` | ![Version](https://img.shields.io/badge/version-1.18.0-blue) | ## 🚀 Quick Start From 7192518b57081b55d896dc4b773ca6c5da55eb46 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Thu, 17 Jul 2025 13:24:43 -0700 Subject: [PATCH 13/15] feat: add multi-architecture build support to CI - Add linux/amd64 and linux/arm64 platform support to Docker Buildx - Configure build-push-action to build for both architectures - Enables ARM64 support for Apple Silicon and ARM-based servers - Maintains backward compatibility with existing amd64 deployments --- .github/workflows/build-and-push.yml | 3 +++ README.md | 18 ------------------ 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml index fa785d1..dd69857 100644 --- a/.github/workflows/build-and-push.yml +++ b/.github/workflows/build-and-push.yml @@ -110,6 +110,8 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + with: + platforms: linux/amd64,linux/arm64 - name: Login to Docker Hub uses: docker/login-action@v3 @@ -136,5 +138,6 @@ jobs: uses: docker/build-push-action@v5 with: context: servers/${{ matrix.context }} + platforms: linux/amd64,linux/arm64 push: ${{ github.ref == 'refs/heads/main' }} tags: ${{ steps.version.outputs.tags }} diff --git a/README.md b/README.md index a016383..4db42b5 100644 --- a/README.md +++ b/README.md @@ -196,24 +196,6 @@ ARG VERSION=1.3.0 This ensures reproducible builds and allows users to pin to specific language server versions. -## 📖 Usage Examples - -For configuration examples and advanced usage, see the **[lspcontainers.nvim documentation](https://github.com/lspcontainers/lspcontainers.nvim)**. - -## 🔍 Development Workflow - -### Local Development -```bash -# Test a single container -make test-gopls - -# Lint all Dockerfiles -make lint - -# Build and test all containers -make test-all -``` - ### 📊 Project Stats - **25+ Language Servers** supported From 48878dbe705d21edad07a27f388e1e6b73e4a748 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Thu, 17 Jul 2025 15:07:29 -0700 Subject: [PATCH 14/15] fix: handle PowerShell ES ARM64 compatibility in multi-arch builds - Add dynamic platform selection for containers with architecture limitations - PowerShell ES builds only for linux/amd64 due to Microsoft base image constraints - All other containers continue to build for linux/amd64,linux/arm64 - Add clear logging to show which platforms are being built for each container This resolves the ARM64 build failure for powershell_es while maintaining multi-architecture support for all other language server containers. --- .github/workflows/build-and-push.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml index dd69857..c0eebb1 100644 --- a/.github/workflows/build-and-push.yml +++ b/.github/workflows/build-and-push.yml @@ -133,11 +133,20 @@ jobs: echo "tags=$TAGS" >> $GITHUB_OUTPUT fi echo "🏷️ Tags that will be used: $TAGS" + + # Set platforms based on container compatibility + if [ "${{ matrix.context }}" = "powershell_es" ]; then + echo "platforms=linux/amd64" >> $GITHUB_OUTPUT + echo "🏗️ PowerShell ES: Building for amd64 only (ARM64 not supported by Microsoft PowerShell base image)" + else + echo "platforms=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT + echo "🏗️ Building for platforms: linux/amd64,linux/arm64" + fi - name: Build and push to Docker Hub uses: docker/build-push-action@v5 with: context: servers/${{ matrix.context }} - platforms: linux/amd64,linux/arm64 + platforms: ${{ steps.version.outputs.platforms }} push: ${{ github.ref == 'refs/heads/main' }} tags: ${{ steps.version.outputs.tags }} From d728880e299ea5aeace552ee38fc44ae677f40b2 Mon Sep 17 00:00:00 2001 From: Erik Reinert <4638629+erikreinert@users.noreply.github.com> Date: Thu, 17 Jul 2025 15:10:02 -0700 Subject: [PATCH 15/15] refactor: remove scheduled nightly builds - Remove daily cron schedule from GitHub Actions workflow - Update README to remove references to automated daily builds - Builds now only trigger on pull requests and pushes to main - Makes sense with static versioning where builds are only needed for changes Static versioning eliminates the need for nightly rebuilds of identical versions. --- .github/workflows/build-and-push.yml | 2 -- README.md | 1 - 2 files changed, 3 deletions(-) diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml index c0eebb1..ab29f54 100644 --- a/.github/workflows/build-and-push.yml +++ b/.github/workflows/build-and-push.yml @@ -4,8 +4,6 @@ on: pull_request: push: branches: [main] - schedule: - - cron: '0 3 * * *' jobs: build_and_push: diff --git a/README.md b/README.md index 4db42b5..d41fa6f 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,6 @@ This ensures reproducible builds and allows users to pin to specific language se ### 📊 Project Stats - **25+ Language Servers** supported -- **Automated daily builds** ensuring freshness - **100% reproducible builds** with pinned versions - **Multi-architecture support** (amd64, arm64) - **Active community** with regular contributions