Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 70e74ab2d2 | |||
| 673554b393 | |||
| 609752e7dc | |||
| fcd959ae1f | |||
| 149120ff6c | |||
| 50770b6e5f | |||
| 01d5ebbdb8 | |||
| d5338ab836 | |||
| a378c0f913 |
@@ -56,5 +56,7 @@ jobs:
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
no-cache: true
|
||||
build-args: CACHE_BUST=${{ github.sha }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
platforms: linux/amd64
|
||||
|
||||
@@ -96,7 +96,9 @@ jobs:
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
no-cache: true
|
||||
build-args: CACHE_BUST=${{ github.sha }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
tags: |
|
||||
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.tag }}
|
||||
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}
|
||||
|
||||
@@ -70,7 +70,7 @@ Container start
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `Dockerfile` | Image definition — installs Chrome, VSCode, Helm, gh CLI, kubeseal, Claude Code, OpenCode, Crush; creates non-root user (UID 1000) |
|
||||
| `Dockerfile` | Image definition — installs Chrome, VSCode, Helm, gh CLI, kubeseal, Claude Code, OpenCode, Crush, LSP servers (pyright, typescript-language-server, gopls, clangd, rust-analyzer, lua-language-server, jdtls, kotlin-language-server, intelephense); creates non-root user (UID 1000) |
|
||||
| `scripts/init-repo.sh` | Configures git credentials, clones GitHub repo(s), generates multi-root workspace file |
|
||||
| `scripts/startapp.sh` | Calls init-repo.sh then opens VSCode in the workspace |
|
||||
| `chart/` | Helm chart for Kubernetes deployment |
|
||||
|
||||
+60
@@ -1,5 +1,8 @@
|
||||
FROM jlesage/baseimage-gui:ubuntu-22.04-v4
|
||||
|
||||
# Bust cache for all layers below (base image pull is still cached)
|
||||
ARG CACHE_BUST
|
||||
|
||||
# Set environment variables
|
||||
ENV APP_NAME="Dev Container" \
|
||||
KEEP_APP_RUNNING=1 \
|
||||
@@ -56,6 +59,13 @@ exec /usr/bin/google-chrome-stable \\\n\
|
||||
"$@"\n' > /usr/local/bin/google-chrome && \
|
||||
chmod +x /usr/local/bin/google-chrome
|
||||
|
||||
# Install Node.js LTS via NodeSource
|
||||
ARG NODE_MAJOR=22
|
||||
RUN curl -fsSL https://deb.nodesource.com/setup_${NODE_MAJOR}.x | bash - && \
|
||||
apt-get install -y nodejs && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
node --version && npm --version
|
||||
|
||||
# Install Claude Code native binary (npm wrapper breaks remote control)
|
||||
RUN curl -fsSL https://claude.ai/install.sh | bash && \
|
||||
cp /root/.local/bin/claude /usr/local/bin/claude && \
|
||||
@@ -107,6 +117,56 @@ RUN KUBESEAL_VERSION=$(curl -sL https://api.github.com/repos/bitnami-labs/sealed
|
||||
tar -xz -C /usr/local/bin kubeseal && \
|
||||
chmod +x /usr/local/bin/kubeseal
|
||||
|
||||
# ── LSP servers for Claude Code language intelligence ──
|
||||
|
||||
# npm-based LSP servers: Python (pyright), TypeScript/JavaScript, PHP
|
||||
RUN npm install -g pyright typescript-language-server typescript intelephense
|
||||
|
||||
# Install Go runtime and gopls LSP server
|
||||
ARG GO_VERSION=1.23.6
|
||||
RUN curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar -xz -C /usr/local && \
|
||||
/usr/local/go/bin/go install golang.org/x/tools/gopls@latest && \
|
||||
mv /root/go/bin/gopls /usr/local/bin/gopls && \
|
||||
rm -rf /root/go
|
||||
ENV PATH="/usr/local/go/bin:${PATH}"
|
||||
|
||||
# Install clangd LSP server (C/C++)
|
||||
RUN apt-get update && \
|
||||
apt-get install -y clangd && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install rust-analyzer LSP server (Rust) — standalone binary, no full toolchain needed
|
||||
RUN RUST_ANALYZER_VERSION=$(curl -sL https://api.github.com/repos/rust-lang/rust-analyzer/releases/latest | jq -r '.tag_name') && \
|
||||
curl -fsSL "https://github.com/rust-lang/rust-analyzer/releases/download/${RUST_ANALYZER_VERSION}/rust-analyzer-x86_64-unknown-linux-gnu.gz" | \
|
||||
gunzip > /usr/local/bin/rust-analyzer && \
|
||||
chmod +x /usr/local/bin/rust-analyzer
|
||||
|
||||
# Install lua-language-server (Lua)
|
||||
RUN LUA_LS_VERSION=$(curl -sL https://api.github.com/repos/LuaLS/lua-language-server/releases/latest | jq -r '.tag_name') && \
|
||||
mkdir -p /opt/lua-language-server && \
|
||||
curl -fsSL "https://github.com/LuaLS/lua-language-server/releases/download/${LUA_LS_VERSION}/lua-language-server-${LUA_LS_VERSION}-linux-x64.tar.gz" | \
|
||||
tar -xz -C /opt/lua-language-server && \
|
||||
ln -s /opt/lua-language-server/bin/lua-language-server /usr/local/bin/lua-language-server
|
||||
|
||||
# Install JDK for Java/Kotlin LSP servers
|
||||
RUN apt-get update && \
|
||||
apt-get install -y openjdk-17-jdk-headless && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install kotlin-language-server
|
||||
RUN KLS_VERSION=$(curl -sL https://api.github.com/repos/fwcd/kotlin-language-server/releases/latest | jq -r '.tag_name') && \
|
||||
curl -fsSL "https://github.com/fwcd/kotlin-language-server/releases/download/${KLS_VERSION}/server.zip" -o /tmp/kls.zip && \
|
||||
unzip -o /tmp/kls.zip -d /opt/kotlin-language-server && \
|
||||
ln -s /opt/kotlin-language-server/server/bin/kotlin-language-server /usr/local/bin/kotlin-language-server && \
|
||||
rm /tmp/kls.zip
|
||||
|
||||
# Install jdtls (Java LSP) — Eclipse JDT Language Server
|
||||
RUN JDTLS_TARBALL=$(curl -sL https://download.eclipse.org/jdtls/snapshots/latest.txt) && \
|
||||
mkdir -p /opt/jdtls && \
|
||||
curl -fsSL "https://download.eclipse.org/jdtls/snapshots/${JDTLS_TARBALL}" | tar -xz -C /opt/jdtls && \
|
||||
printf '#!/bin/bash\nexec java -Declipse.application=org.eclipse.jdt.ls.core.id1 -Dosgi.bundles.defaultStartLevel=4 -Declipse.product=org.eclipse.jdt.ls.core.product -jar /opt/jdtls/plugins/org.eclipse.equinox.launcher_*.jar -configuration /opt/jdtls/config_linux "$@"\n' > /usr/local/bin/jdtls && \
|
||||
chmod +x /usr/local/bin/jdtls
|
||||
|
||||
# Install VSCode (using Microsoft's current recommended setup)
|
||||
RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /tmp/microsoft.gpg && \
|
||||
install -D -o root -g root -m 644 /tmp/microsoft.gpg /usr/share/keyrings/microsoft.gpg && \
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ apiVersion: v2
|
||||
name: devcontainer
|
||||
description: Dev Container with AI coding agents and MCP sidecars
|
||||
type: application
|
||||
version: 2.4.0
|
||||
version: 2.6.0
|
||||
appVersion: "latest"
|
||||
keywords:
|
||||
- development
|
||||
|
||||
@@ -4,6 +4,13 @@ set -e
|
||||
|
||||
echo "=== Repository Initialization ==="
|
||||
|
||||
# Ensure home directory exists on the PVC before any git operations
|
||||
# (git config --global writes to $HOME/.gitconfig, which fails on a fresh volume)
|
||||
RUN_UID="${USER_ID:-1000}"
|
||||
RUN_GID="${GROUP_ID:-1000}"
|
||||
mkdir -p "$HOME"
|
||||
chown "$RUN_UID:$RUN_GID" "$HOME"
|
||||
|
||||
# Set up basic git configuration
|
||||
echo "Configuring git user settings..."
|
||||
# Use environment variables if provided, otherwise use defaults
|
||||
@@ -142,10 +149,6 @@ if [ ${#REPOS[@]} -eq 0 ]; then
|
||||
chown -R "$RUN_UID:$RUN_GID" "$WORKSPACE_DIR"
|
||||
fi
|
||||
|
||||
# Ensure home directory exists on the PVC (may be absent on a fresh volume)
|
||||
mkdir -p "$HOME"
|
||||
chown "$RUN_UID:$RUN_GID" "$HOME"
|
||||
|
||||
# Seed Claude Code settings if missing (disable auto-updater in Docker)
|
||||
if [ ! -f "$HOME/.claude/settings.json" ]; then
|
||||
mkdir -p "$HOME/.claude"
|
||||
|
||||
Reference in New Issue
Block a user