FROM ubuntu:24.04 ENV DEBIAN_FRONTEND=noninteractive # Install base packages RUN apt-get update && apt-get install -y --no-install-recommends \ openssh-server \ passwd \ sudo \ curl \ wget \ git \ jq \ unzip \ ca-certificates \ gnupg \ lsb-release \ iptables \ iproute2 \ postgresql-client \ apt-transport-https \ software-properties-common \ && rm -rf /var/lib/apt/lists/* # Install Node.js 24 RUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* # Install Bun RUN curl -fsSL https://bun.sh/install | bash \ && mv /root/.bun/bin/bun /usr/local/bin/ \ && ln -s /usr/local/bin/bun /usr/local/bin/bunx # Install Docker RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list \ && apt-get update \ && apt-get install -y --no-install-recommends docker-ce docker-ce-cli containerd.io docker-compose-plugin \ && rm -rf /var/lib/apt/lists/* # Install kubectl RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/$(dpkg --print-architecture)/kubectl" \ && install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl \ && rm kubectl # Install Helm RUN curl -fsSL https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash # Enable systemd RUN find /lib/systemd/system/sysinit.target.wants -mindepth 1 -not -name "systemd-tmpfiles-setup.service" -delete; \ find /lib/systemd/system/multi-user.target.wants -mindepth 1 -not -name "systemd-user-sessions.service" -delete; \ rm -f /etc/systemd/system/*.wants/*; \ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*; \ rm -f /lib/systemd/system/anaconda.target.wants/*; # Create dev user with host UID/GID for seamless file permissions ARG HOST_UID=1000 ARG HOST_GID=1000 RUN userdel -r $(getent passwd ${HOST_UID} | cut -d: -f1) 2>/dev/null || true && \ groupdel $(getent group ${HOST_GID} | cut -d: -f1) 2>/dev/null || true && \ groupadd -g ${HOST_GID} dev && \ useradd -m -s /bin/bash -u ${HOST_UID} -g ${HOST_GID} dev && \ echo "dev:dev" | chpasswd && \ echo 'dev ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/dev && \ chmod 440 /etc/sudoers.d/dev && \ usermod -aG docker dev # Setup directories RUN mkdir -p /home/dev/.kube && chown -R dev:dev /home/dev WORKDIR /workspace VOLUME [ "/sys/fs/cgroup" ] CMD ["/usr/sbin/init"]