# Claude Code Devcontainer # Based on Microsoft devcontainer image for better devcontainer integration FROM mcr.microsoft.com/devcontainers/base:ubuntu-24.04 ARG TZ ENV TZ="$TZ" SHELL ["/bin/bash", "-o", "pipefail", "-c"] # Install additional system packages (base image already includes git, curl, sudo, etc.) RUN apt-get update && apt-get install -y --no-install-recommends \ # Modern CLI tools fzf \ ripgrep \ fd-find \ tmux \ zsh \ # Build tools build-essential \ # Utilities jq \ nano \ vim \ unzip \ # Network tools (for security testing) iptables \ ipset \ iproute2 \ dnsutils \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Install git-delta ARG GIT_DELTA_VERSION=0.18.2 RUN ARCH=$(dpkg --print-architecture) && \ curl -fsSL "https://github.com/dandavison/delta/releases/download/${GIT_DELTA_VERSION}/git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb" -o /tmp/git-delta.deb && \ dpkg -i /tmp/git-delta.deb && \ rm /tmp/git-delta.deb # Install uv (Python package manager) via multi-stage copy COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv # Create directories and set ownership (combined for fewer layers) RUN mkdir -p /commandhistory /workspace /home/vscode/.claude /opt && \ touch /commandhistory/.bash_history && \ touch /commandhistory/.zsh_history && \ chown -R vscode:vscode /commandhistory /workspace /home/vscode/.claude /opt # Set environment variables ENV DEVCONTAINER=true ENV SHELL=/bin/zsh ENV EDITOR=nano ENV VISUAL=nano WORKDIR /workspace # Switch to non-root user for remaining setup USER vscode # Set PATH early so claude and other user-installed binaries are available ENV PATH="/home/vscode/.local/bin:$PATH" # Install Claude Code natively with marketplace plugins RUN curl -fsSL https://claude.ai/install.sh | bash && \ claude plugin marketplace add anthropics/skills && \ claude plugin marketplace add trailofbits/skills # Install Python 3.13 via uv (fast binary download, not source compilation) RUN uv python install 3.13 --default # Install ast-grep (AST-based code search) RUN uv tool install ast-grep-cli # Install fnm (Fast Node Manager) and Node 22 ARG NODE_VERSION=22 ENV FNM_DIR="/home/vscode/.fnm" RUN curl -fsSL https://fnm.vercel.app/install | bash -s -- --install-dir "$FNM_DIR" --skip-shell && \ export PATH="$FNM_DIR:$PATH" && \ eval "$(fnm env)" && \ fnm install ${NODE_VERSION} && \ fnm default ${NODE_VERSION} # Install Oh My Zsh ARG ZSH_IN_DOCKER_VERSION=1.2.1 RUN sh -c "$(curl -fsSL https://github.com/deluan/zsh-in-docker/releases/download/v${ZSH_IN_DOCKER_VERSION}/zsh-in-docker.sh)" -- \ -p git \ -x # Download fzf shell integration (Ubuntu 24.04 package doesn't include these) ARG FZF_VERSION=0.44.1 RUN mkdir -p /home/vscode/.fzf && \ curl -fsSL "https://raw.githubusercontent.com/junegunn/fzf/${FZF_VERSION}/shell/key-bindings.zsh" -o /home/vscode/.fzf/key-bindings.zsh && \ curl -fsSL "https://raw.githubusercontent.com/junegunn/fzf/${FZF_VERSION}/shell/completion.zsh" -o /home/vscode/.fzf/completion.zsh # Copy zsh configuration COPY --chown=vscode:vscode .zshrc /home/vscode/.zshrc.custom # Append custom zshrc to the main one RUN echo 'source ~/.zshrc.custom' >> /home/vscode/.zshrc # Copy post_install script COPY --chown=vscode:vscode post_install.py /opt/post_install.py