Add devcontainer

This commit is contained in:
Matt Spencer
2026-07-13 09:42:48 +00:00
parent f5c6fa19ac
commit 759f77f58a
5 changed files with 212 additions and 0 deletions
+13
View File
@@ -0,0 +1,13 @@
<!-- ~/.ros2/dds/cyclonedds.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<CycloneDDS xmlns="https://cdds.io/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://cdds.io/config
https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
<Domain Id="any">
<Discovery>
<ParticipantIndex>auto</ParticipantIndex>
<MaxAutoParticipantIndex>1000</MaxAutoParticipantIndex>
</Discovery>
</Domain>
</CycloneDDS>
+76
View File
@@ -0,0 +1,76 @@
FROM osrf/ros:jazzy-desktop-full
ARG USERNAME=USERNAME
ARG USER_UID=1000
ARG USER_GID=$USER_UID
# Delete user if it exists in container (e.g Ubuntu Noble: ubuntu)
RUN if id -u $USER_UID ; then userdel `id -un $USER_UID` ; fi
# Create the user
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
#
# [Optional] Add sudo support. Omit if you don't need to install software after connecting.
&& apt-get update \
&& apt-get install -y --no-install-recommends sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME \
&& rm -rf /var/lib/apt/lists/*
# Make sure the base image is completely up to date
RUN apt-get update \
&& apt-get upgrade -y \
&& rm -rf /var/lib/apt/lists/*
# C++ development tools
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
cmake \
gdb \
clang \
clang-format \
clang-tidy \
libboost-all-dev \
&& rm -rf /var/lib/apt/lists/*
# Python development tools
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
python3-pip \
python3-dev \
python3-argcomplete \
python3-colcon-common-extensions \
python3-colcon-mixin \
python3-rosdep \
python3-vcstool \
&& rm -rf /var/lib/apt/lists/*
# Optional: pre-install apt dependencies resolved from rosdep on a previous run.
COPY .devcontainer/jazzy/ /tmp/devcontainer-jazzy/
RUN apt-get update \
&& if [ -f /tmp/devcontainer-jazzy/rosdep-apt-packages.txt ]; then \
grep -Ev '^\s*($|#)' /tmp/devcontainer-jazzy/rosdep-apt-packages.txt | xargs -r apt-get install -y --no-install-recommends; \
fi \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp \
&& rm -rf /var/lib/apt/lists/*
# ROS 2 ament build tools
# RUN apt-get install -y \
# ros-${ROS_DISTRO}-ament-cmake \
# ros-${ROS_DISTRO}-ament-cmake-auto \
# ros-${ROS_DISTRO}-ament-python \
# ros-${ROS_DISTRO}-ament-lint-auto \
# ros-${ROS_DISTRO}-ament-lint-common
ENV SHELL=/bin/bash
# [Optional] Set the default user. Omit if you want to keep the default as root.
USER $USERNAME
CMD ["/bin/bash"]
+42
View File
@@ -0,0 +1,42 @@
{
"name": "ROS 2 Jazzy",
"privileged": true,
"remoteUser": "${localEnv:USER}",
"build": {
"context": "../..",
"dockerfile": "Dockerfile.jazzy",
"args": {
"USERNAME": "${localEnv:USER}"
}
},
"workspaceFolder": "/workspaces/agv_pro_ros2",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"anthropic.claude-code"
]
}
},
"containerEnv": {
"DISPLAY": ":0",
"ROS_AUTOMATIC_DISCOVERY_RANGE": "SUBNET",
"ROS_DOMAIN_ID": "0",
"RMW_IMPLEMENTATION": "rmw_cyclonedds_cpp",
"CYCLONEDDS_URI": "/workspaces/agv_pro_ros2/.devcontainer/cyclonedds.xml"
},
"runArgs": [
"--network=robot-sim",
"--pid=host",
"--ipc=host",
"-e",
"DISPLAY=${env:DISPLAY}"
],
"mounts": [
"source=/tmp/.X11-unix,target=/tmp/.X11-unix,type=bind,consistency=cached",
"source=/dev/dri,target=/dev/dri,type=bind,consistency=cached",
"source=/usr/local/share/ca-certificates,target=/usr/local/share/host-certificates,type=bind,consistency=cached",
"source=${localEnv:HOME}/.ssh,target=/home/${localEnv:USER}/.ssh,type=bind,consistency=cached"
],
"postCreateCommand": "bash .devcontainer/post-create.sh"
}
+43
View File
@@ -0,0 +1,43 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ROSDEP_APT_LIST_FILE="${ROOT_DIR}/.devcontainer/${ROS_DISTRO}/rosdep-apt-packages.txt"
if [[ -f /usr/local/share/host-certificates/AMD_CA.crt ]]; then
sudo cp /usr/local/share/host-certificates/AMD_CA.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
fi
if [[ ! -f "${ROSDEP_APT_LIST_FILE}" ]]; then
echo "Missing ${ROSDEP_APT_LIST_FILE}."
echo "Run .devcontainer/refresh-rosdep-cache.sh and rebuild the devcontainer."
exit 1
fi
tmp_packages="$(mktemp)"
cleanup() {
rm -f "${tmp_packages}"
}
trap cleanup EXIT
export DEBIAN_FRONTEND=noninteractive
sudo apt-get update -qq
rosdep keys --from-paths src --ignore-src 2>/dev/null \
| xargs -r rosdep resolve --rosdistro "${ROS_DISTRO}" --filter-for-installers=apt 2>/dev/null \
| sed -e '/^#/d' -e '/^$/d' \
| LC_ALL=C sort -u > "${tmp_packages}"
if ! diff -u <(grep -Ev '^\s*($|#)' "${ROSDEP_APT_LIST_FILE}") "${tmp_packages}" >/dev/null; then
echo "rosdep-resolved apt packages differ from ${ROSDEP_APT_LIST_FILE}."
echo "Run .devcontainer/refresh-rosdep-cache.sh and rebuild the devcontainer."
exit 1
fi
echo "rosdep apt cache is current; no post-create package installation needed."
if compgen -G "${ROOT_DIR}/src/robotnik/robotnik_simulation/debs/ros-jazzy-*.deb" > /dev/null; then
sudo apt-get install -y "${ROOT_DIR}"/src/robotnik/robotnik_simulation/debs/ros-jazzy-*.deb
fi
+38
View File
@@ -0,0 +1,38 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ROS_DISTRO="${ROS_DISTRO:-jazzy}"
CACHE_DIR="${ROOT_DIR}/.devcontainer/${ROS_DISTRO}"
APT_LIST_FILE="${CACHE_DIR}/rosdep-apt-packages.txt"
cd "${ROOT_DIR}"
mkdir -p "${CACHE_DIR}"
if [[ ! -f /etc/ros/rosdep/sources.list.d/20-default.list ]]; then
sudo rosdep init
fi
rosdep update
export DEBIAN_FRONTEND=noninteractive
sudo apt-get update -qq
tmp_packages="$(mktemp)"
cleanup() {
rm -f "${tmp_packages}"
}
trap cleanup EXIT
rosdep keys --from-paths src --ignore-src 2>/dev/null \
| xargs -r rosdep resolve --rosdistro "${ROS_DISTRO}" --filter-for-installers=apt 2>/dev/null \
| sed -e '/^#/d' -e '/^$/d' \
| LC_ALL=C sort -u > "${tmp_packages}"
{
echo "# Generated by .devcontainer/refresh-rosdep-cache.sh"
echo "# apt packages resolved from rosdep keys in src"
cat "${tmp_packages}"
} > "${APT_LIST_FILE}"
echo "Updated ${APT_LIST_FILE}"