Isaac ROS Dockerfile¶
The Dockerfile and supporting files for the Isaac ROS container.
Dockerfile¶
Located at ~/workspaces/isaac_ros-dev/Dockerfile:
FROM nvcr.io/nvidia/isaac/ros:noble-ros2_jazzy_<hash>-amd64
# Remove broken yarn repo from base image, add standard ROS 2 apt repo
RUN rm -f /etc/apt/sources.list.d/yarn.list \
&& curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
-o /usr/share/keyrings/ros-archive-keyring.gpg \
&& echo "deb [arch=amd64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu noble main" \
> /etc/apt/sources.list.d/ros2.list
# Isaac ROS GPU perception + Foxglove H.264 + ffmpeg + teleop
RUN apt-get update && apt-get install -y --no-install-recommends \
ros-jazzy-isaac-ros-apriltag \
ros-jazzy-isaac-ros-visual-slam \
ros-jazzy-isaac-ros-nvblox \
ros-jazzy-foxglove-compressed-video-transport \
ros-jazzy-ffmpeg-encoder-decoder \
ros-jazzy-teleop-twist-keyboard \
ros-jazzy-teleop-twist-joy \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*
# Create admin user
RUN useradd -m -s /bin/bash -G sudo admin \
&& echo "admin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# FastDDS no-SHM XML (fixes host<->container DDS transport)
COPY fastdds_no_shm.xml /etc/fastdds_no_shm.xml
# Persistent env var for FastDDS fix (login shells)
RUN echo 'export FASTRTPS_DEFAULT_PROFILES_FILE=/etc/fastdds_no_shm.xml' \
> /etc/profile.d/fastdds-fix.sh \
&& chmod +x /etc/profile.d/fastdds-fix.sh
# Foxglove-bridge auto-start entrypoint
COPY 50-foxglove-bridge.sh /usr/local/bin/scripts/entrypoint_additions/
RUN chmod +x /usr/local/bin/scripts/entrypoint_additions/50-foxglove-bridge.sh
# H.264 NVENC republisher auto-start entrypoint
COPY 60-h264-republisher.sh /usr/local/bin/scripts/entrypoint_additions/
RUN chmod +x /usr/local/bin/scripts/entrypoint_additions/60-h264-republisher.sh
# Teleop twist joy auto-start entrypoint (converts Joy → Twist on /cmd_vel)
COPY 70-teleop-twist-joy.sh /usr/local/bin/scripts/entrypoint_additions/
RUN chmod +x /usr/local/bin/scripts/entrypoint_additions/70-teleop-twist-joy.sh
WORKDIR /workspaces/isaac_ros-dev
Why the ROS 2 apt repo is added manually¶
The NVIDIA base image only includes NVIDIA's own apt repos (for Isaac ROS packages like apriltag, cuVSLAM, nvblox). Community packages like teleop_twist_joy are only available from the standard ROS 2 repo at packages.ros.org. The base image also ships with a broken yarn repo (expired GPG key) that causes apt-get update to fail — the Dockerfile removes it.
docker-compose.yml¶
services:
isaac_ros:
image: isaac-ros-dev:latest
container_name: isaac_ros_dev_container
runtime: nvidia
network_mode: host
ipc: host
privileged: true
environment:
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=all
- USERNAME=admin
volumes:
- /home/zeul/workspaces/isaac_ros-dev:/workspaces/isaac_ros-dev
entrypoint: /usr/local/bin/scripts/workspace-entrypoint.sh
command: bash -c "sleep infinity"
Docker flags explained¶
| Flag | Why |
|---|---|
runtime: nvidia |
GPU access via NVIDIA Container Toolkit |
network_mode: host |
Share host network — DDS topics flow between Isaac Sim and container |
ipc: host |
Shared memory access (needed by some NVIDIA libraries) |
privileged: true |
Full device access (GPU, USB, etc.) |
entrypoint |
NVIDIA's startup script that runs entrypoint_additions scripts |
sleep infinity |
Keep container running in background |
Build and Run¶
# Build (base image cached, only custom layer rebuilds ~30s)
cd ~/workspaces/isaac_ros-dev
docker build -t isaac-ros-dev:latest .
# Start
docker compose up -d
# Rebuild and restart in one command
docker compose up -d --build
# Attach
docker exec -it -u admin isaac_ros_dev_container bash
# Stop and remove
docker compose down
Image Sizes¶
| Image | Size | What it is |
|---|---|---|
nvcr.io/nvidia/isaac/ros:noble-ros2_jazzy_... |
38.8 GB | NVIDIA base (immutable) |
isaac-ros-dev:latest |
~39.6 GB | Base + custom layer (~0.8 GB added) |
The base image is shared between both — Docker deduplicates layers. Total disk usage is ~39.6 GB, not 78.4 GB.