FROM ubuntu:22.04 # Prevent interactive prompts during installation ENV DEBIAN_FRONTEND=noninteractive # Set up user and workspace ENV USER=developer ENV HOME=/home/$USER ENV WORKSPACE=$HOME/workspace ENV SDKMAN_DIR=$HOME/.sdkman # Install base dependencies RUN apt-get update && apt-get install -y \ curl \ wget \ git \ build-essential \ zip \ unzip \ software-properties-common \ ca-certificates \ gnupg \ lsb-release \ sudo \ nano \ vim \ htop \ net-tools \ && rm -rf /var/lib/apt/lists/* # Create developer user with sudo privileges RUN useradd -m -s /bin/bash -G sudo $USER && \ echo "$USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ mkdir -p $WORKSPACE && \ chown -R $USER:$USER $HOME # Switch to developer user USER $USER WORKDIR $HOME # Install SDKMAN RUN curl -s "https://get.sdkman.io" | bash # Install multiple Java versions via SDKMAN RUN bash -c "source $SDKMAN_DIR/bin/sdkman-init.sh && \ sdk install java 11.0.22-tem && \ sdk install java 17.0.10-tem && \ sdk install java 21.0.2-tem && \ sdk install java 25-tem && \ sdk default java 25-tem" # Install Maven and Gradle RUN bash -c "source $SDKMAN_DIR/bin/sdkman-init.sh && \ sdk install maven && \ sdk install gradle" # Switch back to root for system-level installations USER root # Install Docker CLI (no daemon - will use host socket) RUN install -m 0755 -d /etc/apt/keyrings && \ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \ chmod a+r /etc/apt/keyrings/docker.gpg && \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ apt-get update && \ apt-get install -y docker-ce-cli docker-compose-plugin && \ usermod -aG docker $USER && \ rm -rf /var/lib/apt/lists/* # Install ttyd (web terminal) RUN wget https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.x86_64 -O /usr/local/bin/ttyd && \ chmod +x /usr/local/bin/ttyd # Install Node.js (needed for Claude Code CLI) RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ apt-get install -y nodejs && \ rm -rf /var/lib/apt/lists/* # Switch back to developer user USER $USER # Install Claude Code CLI RUN npm install -g @anthropic-ai/claude-code # Create .claude directory (will be mounted with credentials from Mac) RUN mkdir -p $HOME/.claude # Source SDKMAN in bashrc for interactive shells RUN echo 'source "$SDKMAN_DIR/bin/sdkman-init.sh"' >> $HOME/.bashrc # Create startup script USER root COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh # Expose ports # 7681: ttyd (web terminal) EXPOSE 7681 USER $USER WORKDIR $WORKSPACE ENTRYPOINT ["/entrypoint.sh"]