FROM codercom/enterprise-base:ubuntu ARG DEBIAN_FRONTEND=noninteractive ARG TEA_VERSION= ARG TEA_ARCH=amd64 ARG ROS_DISTRO= USER root ENV LANG=en_US.UTF-8 RUN apt-get update && \ apt-get upgrade -y && \ apt-get install -y \ build-essential ca-certificates curl git gnupg jq locales pkg-config \ software-properties-common sudo unzip wget zip && \ locale-gen en_US en_US.UTF-8 && \ update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ rm -rf /var/lib/apt/lists/* RUN curl -fsSL https://get.docker.com | sh RUN tea_version="${TEA_VERSION}" && \ if [ -z "$tea_version" ]; then \ tea_version="$(curl -fsSL https://gitea.com/api/v1/repos/gitea/tea/releases/latest | jq -r .tag_name)"; \ fi && \ tea_version="${tea_version#v}" && \ curl -fsSL "https://dl.gitea.com/tea/${tea_version}/tea-${tea_version}-linux-${TEA_ARCH}" \ -o /usr/local/bin/tea && \ chmod 755 /usr/local/bin/tea RUN apt-get update && \ apt-get install -y \ clang clang-format clangd cmake gdb ninja-build valgrind && \ rm -rf /var/lib/apt/lists/* RUN apt-get update && \ apt-get install -y python3 python3-dev python3-pip python3-venv && \ rm -rf /var/lib/apt/lists/* && \ update-alternatives --install /usr/bin/python python /usr/bin/python3 1 RUN . /etc/os-release && \ if [ -z "${ROS_DISTRO}" ]; then \ case "${UBUNTU_CODENAME}" in \ jammy) ROS_DISTRO=humble ;; \ noble) ROS_DISTRO=jazzy ;; \ *) echo "No ROS 2 distribution mapped for Ubuntu ${UBUNTU_CODENAME}, set the ROS_DISTRO build argument" >&2 && exit 1 ;; \ esac; \ fi && \ add-apt-repository -y universe && \ curl -fsSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \ -o /usr/share/keyrings/ros-archive-keyring.gpg && \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu ${UBUNTU_CODENAME} main" \ > /etc/apt/sources.list.d/ros2.list && \ apt-get update && \ apt-get install -y \ python3-colcon-common-extensions python3-rosdep python3-vcstool \ ros-dev-tools "ros-${ROS_DISTRO}-desktop" && \ rosdep init && \ rm -rf /var/lib/apt/lists/* RUN printf '%s\n' \ 'for ros_setup in /opt/ros/*/setup.bash; do' \ ' [ -r "$ros_setup" ] && . "$ros_setup"' \ 'done' \ >> /etc/bash.bashrc ENV UV_INSTALL_DIR=/opt/uv/bin RUN curl -LsSf https://astral.sh/uv/install.sh | sh ENV CLAUDE_HOME=/opt/claude RUN mkdir -p ${CLAUDE_HOME} && \ env HOME=${CLAUDE_HOME} bash -c 'curl -fsSL https://claude.ai/install.sh | bash' && \ ln -s ${CLAUDE_HOME}/.local/bin/claude /usr/local/bin/claude && \ chown -R coder:coder ${CLAUDE_HOME} USER coder ENV PATH="/opt/uv/bin:${PATH}"