The following is a fully configured docker run command for reference. Most setups won't need every flag or mount, but this covers the full range of hardware configurations you may encounter.

The example below corresponds to a config with 1 robot, 2 ZedX Mini (GMSL) cameras**, and 1 RealSense AI D435** camera on a 6dof actuated neck. The robot uses ROS for real-time control over a specified domain ID, with CycloneDDS as the middleware.

docker run -it --rm \\
  --name sentinel-runtime-1 \\
  --privileged \\
  --network host \\
  --runtime nvidia \\
  --gpus all \\
  --group-add video \\
  --group-add plugdev \\
  $(getent group render >/dev/null && echo "--group-add $(getent group render | cut -d: -f3)") \\
  $(getent group i2c >/dev/null && echo "--group-add $(getent group i2c | cut -d: -f3)") \\
  -v /dev:/dev \\
  -v /tmp:/tmp \\
  -v sentinel-zed-models:/usr/local/zed/resources \\
  -v "$HOME/datasets:/datasets" \\
  -v "$HOME/teleop_ws/cyclonedds.xml:/cyclonedds.xml:ro" \\
  -v "$HOME/telwop_ws/robot.yaml:/config/robot.yaml:ro" \\
  -v "$HOME/teleop_ws/.xlerobot_neck_calibration.json:/config/neck_calibration.json" \\
  -e NVIDIA_VISIBLE_DEVICES=all \\
  -e NVIDIA_DRIVER_CAPABILITIES=all \\
  -e RMW_IMPLEMENTATION=rmw_cyclonedds_cpp \\
  -e ROS_DOMAIN_ID=1 \\
  -e CYCLONEDDS_URI="/cyclonedds.xml" \\
  $AVEA_SENTINEL_REGISTRY/sentinel-runtime:${VERSION}-${PLATFORM}

Flags

The following snippet conditionally adds the render and i2c groups only if they exist on the host:

$(getent group render >/dev/null && echo "--group-add $(getent group render | cut -d: -f3)") \\
$(getent group i2c >/dev/null && echo "--group-add $(getent group i2c | cut -d: -f3)") \\

These are required for ZedX cameras — without them, the ZED SDK cannot reliably access the GPU for GMSL deserialization. The i2c group doesn't exist on most x86 systems, so the conditional check ensures the flag is only added when the group is present

Mounts