105 lines
2.8 KiB
Docker
105 lines
2.8 KiB
Docker
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"]
|