Installation#

Isaac Sim 6.2.0 Python 3.12 Ubuntu 24.04 Windows 11

Isaac Lab installs Newton by default. The standard installation runs without Isaac Sim; add Isaac Sim or other optional backends when your workflow needs them. Start with the automatic uv setup, or choose another installation method below.

Choose an installation path#

Automatic setup with uv

Run with Newton from the Isaac Lab checkout while uv manages the environment. Recommended for most users.

Automatic setup with uv (recommended)
isaaclab.sh installer (legacy)

Use the legacy installer script to select packages in a virtual environment.

isaaclab.sh installer (legacy)
Python environment with Isaac Sim

Manage a uv, venv, or conda environment and install Isaac Sim with pip.

Python environment with Isaac Sim
Isaac Lab Python package

Install the released Isaac Lab package as a dependency of your own project.

Isaac Lab Python package
Downloaded Isaac Sim package

Download Isaac Sim and use the Python interpreter included with it.

Downloaded Isaac Sim package
Build Isaac Sim from source

Build or modify Isaac Sim itself. This is an advanced workflow.

Build Isaac Sim from source
Docker containers

Build or run a container with the physics and rendering stack you need.

Docker containers
Cloud workstations

Provision a remote GPU workstation on a supported cloud provider.

Cloud workstations

System requirements#

Isaac Lab installs Newton by default, using NVIDIA Warp for simulation. The requirements below cover the default Newton and PyTorch training environment; Isaac Sim is an optional addition.

Component

Requirement

Python

Python 3.12. The automatic uv setup manages the environment.

Platform

Ubuntu 22.04+ on x86_64, Linux aarch64 (including DGX Spark), or Windows 11 on x86_64.

GPU training

A CUDA-capable NVIDIA GPU supported by the selected Newton solver and PyTorch. The default CUDA 13 stack requires Turing or newer (compute capability 7.5+).

NVIDIA driver

580.65.06 or newer on Linux; 580.88 or newer on Windows. Use a current production driver for your GPU.

Memory

RAM and VRAM needs depend on the task, number of parallel environments, and camera workload. Isaac Sim’s workstation memory requirements do not apply to a Newton-only installation.

This release uses Warp 1.17. Its prebuilt wheels include the CUDA components needed by Warp, so a separate CUDA Toolkit installation is not needed for standard wheel-based use. See Warp installation and compatibility for its platform and GPU requirements.

Hint

The default environment also installs PyTorch with CUDA 13.0, which sets the driver minimum above. Warp 1.17’s CUDA 12 wheels alone can run with older drivers; meeting only Warp’s minimum is not enough for the default GPU training environment. See the PyTorch CUDA 13.0 requirements.

Optional Isaac Sim and rendering#

  • Isaac Sim: Install the isaacsim extra for Isaac Sim 6.2 / PhysX workflows. On Linux, its wheels require GLIBC 2.35+. For x86_64 workstations, plan for at least 32 GB RAM, 16 GB VRAM, and a supported RTX GPU; training and rendering may need more. Check the Isaac Sim requirements for supported GPUs, tested drivers, and DGX Spark support. Isaac Sim 5.1 and older are unsupported.

  • Rendering: Headless Newton simulation does not require RTX hardware. Add the requirements of your chosen renderer or visualizer when you need camera images or an interactive view. RTX rendering has its own GPU and driver requirements.

Linux aarch64 and DGX Spark requirements

DGX Spark requires CUDA 13 or newer and the corresponding PyTorch build. Install the build prerequisites before installing Isaac Lab:

sudo apt install python3.12-dev libgl1-mesa-dev libx11-dev libxcursor-dev \
   libxi-dev libxinerama-dev libxrandr-dev

SkillGen, XR teleoperation, livestream, Hub Workstation Cache, Cosmos Transfer1, and RLinf are not currently supported or validated on DGX Spark. SkillGen depends on native CUDA/C++ extensions whose toolchain has not been validated on DGX Spark, while XR remains limited by unvalidated encoding performance.

isaaclab.sh installer (legacy)#

Kit-less installation uses a Python 3.12 environment and does not install Isaac Sim. Clone Isaac Lab, create and activate an environment, then install the default source packages and dependencies. Install uv or conda before starting:

git clone git@github.com:isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab
git clone https://github.com/isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab
uv venv --python 3.12 --seed env_isaaclab
source env_isaaclab/bin/activate
uv pip install --upgrade pip
./isaaclab.sh -i
uv venv --python 3.12 --seed env_isaaclab
env_isaaclab\Scripts\activate
uv pip install --upgrade pip
isaaclab.bat -i
conda create -n env_isaaclab python=3.12
conda activate env_isaaclab
python -m pip install --upgrade pip
./isaaclab.sh -i
conda create -n env_isaaclab python=3.12
conda activate env_isaaclab
python -m pip install --upgrade pip
isaaclab.bat -i

-i always installs the core source packages. With no value, it also installs the optional mimic and teleop submodules plus the default Newton, RL, and visualizer dependencies. It does not install tetrahedralization, contrib, ov, or Isaac Sim; request those explicitly when needed.

Use -i core for core packages only. Otherwise, pass a comma-separated list of selectors:

Selector

Installs

mimic

Imitation-learning tools.

teleop

Teleoperation tools (Linux x86_64).

newton

Newton interactive-viewer dependencies.

rl[<framework>]

RL framework dependencies. Select rsl-rl, skrl, sb3, or rl-games.

visualizer[<backend>]

Visualizer dependencies. Select rerun, viser, newton, or kit.

tetrahedralization

Dependencies for automatic tetrahedral mesh generation.

contrib[rlinf]

Contrib runtime dependencies for RLinF.

ov[<runtime>]

OV runtime wheels. Select ovrtx, ovphysx, or all.

isaacsim

The Isaac Sim pip package.

For example:

# Core packages only
./isaaclab.sh -i core

# Newton, RSL-RL, and the Newton visualizer
./isaaclab.sh -i 'newton,rl[rsl-rl],visualizer[newton]'

# OVRTX runtime dependencies
./isaaclab.sh -i 'ov[ovrtx]'
:: Core packages only
isaaclab.bat -i core

:: Newton, RSL-RL, and the Newton visualizer
isaaclab.bat -i "newton,rl[rsl-rl],visualizer[newton]"

:: OVRTX runtime dependencies
isaaclab.bat -i "ov[ovrtx]"

Python environment with Isaac Sim#

Use this path when you want an editable Isaac Lab checkout with full Isaac Sim support and a Python environment you manage yourself. Create and activate the environment before installing Isaac Sim or Isaac Lab. Isaac Sim’s pip packages require GLIBC 2.35 or newer on Linux. Enable Windows long-path support before installing on Windows.

Note

If you plan to set up Visual Studio Code, use the downloaded Isaac Sim package instead.

Create and activate a Python 3.12 environment:

uv venv --python 3.12 --seed env_isaaclab
source env_isaaclab/bin/activate
uv venv --python 3.12 --seed env_isaaclab
env_isaaclab\Scripts\activate
conda create -n env_isaaclab python=3.12
conda activate env_isaaclab

Install Isaac Sim and the CUDA 13.0 PyTorch build for your platform:

uv pip install -U torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu130
uv pip install -U torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu130

Note

On aarch64 systems such as DGX Spark, install the required development packages before installing Isaac Sim:

sudo apt install python3.12-dev libgl1-mesa-dev libx11-dev libxcursor-dev libxi-dev \
   libxinerama-dev libxrandr-dev
uv pip install -U torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu130

Note

If the system and PyTorch GNU OpenMP libraries are both preloaded, Isaac Sim can emit libgomp warnings. Use the system OpenMP library:

unset LD_PRELOAD
export LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1

Note

If importing omni.client or torch fails because libcarb.so cannot allocate a static TLS block, preload libcarb.so before launching Python:

export LD_PRELOAD=$(python -c "import sys,os;[print(os.path.join(p,'omni','client','libcarb.so')) for p in sys.path if os.path.isfile(os.path.join(p,'omni','client','libcarb.so'))]" 2>/dev/null | head -1)${LD_PRELOAD:+:$LD_PRELOAD}

./isaaclab.sh -p configures this automatically, as does the conda activation hook.

The first launch asks you to accept the NVIDIA Omniverse EULA. For non-interactive environments, set OMNI_KIT_ACCEPT_EULA=yes. Verify Isaac Sim with isaacsim.

With the environment still active, clone, install, and verify Isaac Lab:

git clone git@github.com:isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab
git clone https://github.com/isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab
sudo apt install cmake build-essential
./isaaclab.sh -i
./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --viz kit
isaaclab.bat -i
isaaclab.bat -p scripts\tutorials\00_sim\create_empty.py --viz kit

The verification command should open a black simulator viewport. The initial launch can take over ten minutes while Isaac Sim downloads extensions.

Isaac Lab Python package#

Use this path when Isaac Lab is a dependency of an external Python project. The released isaaclab package includes the unified train, play, zero_agent, random_agent, benchmark, train_multigpu, demo, and example commands. Downstream projects can register their task package through the isaaclab.tasks Python package entry-point group; projects created by the template generator configure this automatically.

To create a project built on Isaac Lab, see Build your own project or task.

Note

Isaac Lab wheels are published for major releases, not every patch release.

Installing an unreleased Git revision#

The aggregate package can also be built directly from an Isaac Lab Git revision. Point uv at the tools/wheel_builder subdirectory so it uses the same dependency metadata and packaged runtime resources as a released wheel:

[project]
dependencies = ["isaaclab"]

[tool.uv.sources]
isaaclab = { git = "https://github.com/isaac-sim/IsaacLab.git", rev = "<git-revision>", subdirectory = "tools/wheel_builder" }

Use a commit hash or release tag for reproducible environments. A branch name is accepted, but updating the lockfile can then select a newer Isaac Lab revision and dependency set.

Installing the published wheel#

Use NVIDIA’s package index for the 3.0.0 release. Do not point Isaac Lab at the Git source from the previous workflow when installing the published wheel.

Run the published package directly or install it into a persistent environment. All workflows start with the base isaaclab package; add optional capabilities only when your project needs them.

uvx --index https://pypi.nvidia.com \
   --torch-backend cu130 \
   --from "isaaclab==3.0.0" \
   isaaclab demo zoo

This resolves the published wheel from the package index into an isolated environment. It does not require a source checkout, wheel download, or project file.

uv init --python 3.12 my_isaaclab_project
cd my_isaaclab_project
uv add \
   --index-strategy unsafe-best-match \
   --index pytorch-cu130=https://download.pytorch.org/whl/cu130 \
   torch==2.11.0 torchvision==0.26.0
uv add \
   --index-strategy unsafe-best-match \
   --index nvidia=https://pypi.nvidia.com \
   isaaclab==3.0.0
uv venv --python 3.12 env_isaaclab
source env_isaaclab/bin/activate
uv pip install isaaclab==3.0.0 \
   --index https://pypi.nvidia.com \
   --torch-backend cu130
uv venv --python 3.12 env_isaaclab
env_isaaclab\Scripts\activate
uv pip install isaaclab==3.0.0 ^
   --index https://pypi.nvidia.com ^
   --torch-backend cu130
uv venv --python 3.12 env_isaaclab
source env_isaaclab/bin/activate
uv pip install isaaclab==3.0.0 \
   --index https://pypi.nvidia.com \
   --torch-backend cu130

The project workflow records the dependencies, package indexes, and lockfile for an application you maintain; the commands make those project-file changes, so no manual editing is required. Use uvx for one-off commands or a standalone environment for exploratory work that needs an activated Python environment. Pass the same index strategy when adding or upgrading dependencies in the project.

Optional extras#

Add extras only when your project needs them. Most extras work with uv pip install "isaaclab[<extra>]" in a standalone environment or uv add "isaaclab[<extra>]" in a uv project. The importers and isaacsim extras have dedicated commands below.

Extra

What it installs

isaacsim

Isaac Sim (isaacsim[all,extscache] version 6.2.0.0) from pypi.nvidia.com.

ov

Both OV backends: OV PhysX and OV RTX.

ovphysx / ovrtx

OV PhysX only / OV RTX only.

sb3 / skrl / rsl-rl / rlinf / torchrl

The corresponding RL framework.

skrl-jax

skrl with CUDA-enabled JAX.

rerun / viser

The corresponding visualizer.

mimic / teleop

Isaac Lab Mimic / XR teleoperation. The wheel’s mimic extra does not include Robomimic.

tetrahedralization / video

Mesh tetrahedralization / video recording.

leapp

LEAP model export support.

importers

Standalone URDF and MJCF conversion without Isaac Sim.

all

The curated ov, sb3, skrl, rsl-rl, rerun, and viser extras. Isaac Sim is not included.

test

Developer test and documentation tooling.

Use all for the curated list above. Isaac Sim, standalone importers, specialized extras (skrl-jax, rlinf, mimic, teleop, tetrahedralization, video, leapp), and the developer test tooling remain opt-in.

Note

RL-Games and Robomimic are not included in the published wheel metadata because the versions used by Isaac Lab are installed from Git and do not provide package-index wheels. To use either integration, install Isaac Lab from a source checkout and select the rl-games or mimic extra there.

Note

On Linux, the mimic extra may build its egl-probe dependency from source. Install CMake and a C++ compiler first with sudo apt install cmake build-essential.

Installing the importers extra#

Install this extra to convert URDF and MJCF files without Isaac Sim.

Warning

Use the full command below. Without the overrides, the importer extra can downgrade packages used by the base Isaac Lab install. The overrides keep Isaac Lab’s tested versions.

uv pip install "isaaclab[importers]==3.0.0rc1" \
  --overrides "https://raw.githubusercontent.com/isaac-sim/IsaacLab/v3.0.0-EA/tools/wheel_builder/uv-overrides.txt" \
  --index https://pypi.nvidia.com \
  --torch-backend cu130 \
  --index-strategy unsafe-best-match

Installing the isaacsim extra#

Isaac Sim 6.2 pins dependencies that conflict with Isaac Lab. Install the isaacsim extra with the tested overrides:

uv pip install "isaaclab[isaacsim]==3.0.0rc1" \
  --overrides "https://raw.githubusercontent.com/isaac-sim/IsaacLab/v3.0.0-EA/tools/wheel_builder/uv-overrides.txt" \
  --extra-index-url https://pypi.nvidia.com \
  --torch-backend cu130 \
  --index-strategy unsafe-best-match

Add other extras inside the brackets when needed; for example, use isaaclab[isaacsim,all] to include the curated all list.

Installing CUDA-enabled PyTorch#

The published-wheel commands above select the CUDA 13.0 PyTorch build during dependency resolution. To update an existing standalone environment that was installed without the CUDA index, use the command for your platform:

uv pip install -U torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu130
uv pip install -U torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu130

Note

Install the required Python, OpenGL, and X11 development packages before installing Isaac Lab:

sudo apt install python3.12-dev libgl1-mesa-dev libx11-dev libxcursor-dev libxi-dev \
   libxinerama-dev libxrandr-dev
uv pip install -U torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu130

Note

If Isaac Sim reports OpenMP preload warnings, use the system GNU OpenMP library:

unset LD_PRELOAD
export LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1

Note

If importing omni.client or torch fails because libcarb.so cannot allocate a static TLS block, preload libcarb.so before launching Python:

export LD_PRELOAD=$(python -c "import sys,os;[print(os.path.join(p,'omni','client','libcarb.so')) for p in sys.path if os.path.isfile(os.path.join(p,'omni','client','libcarb.so'))]" 2>/dev/null | head -1)${LD_PRELOAD:+:$LD_PRELOAD}

If you installed the isaacsim extra, verify it before running your project:

isaacsim

The first launch downloads Isaac Sim extensions and can take more than ten minutes. It also asks you to accept the NVIDIA Omniverse EULA; set OMNI_KIT_ACCEPT_EULA=yes for a non-interactive environment. Run a project script with python my_script.py.

Generate VS Code or Cursor settings for the current workspace with:

uv run isaaclab --editor

Warning

This command generates .vscode/settings.json and pyrightconfig.json in the workspace. The Pyright configuration inherits an existing [tool.pyright] table and adds paths discovered from the active Python environment.

Downloaded Isaac Sim package#

Use this path when you prefer a downloaded Isaac Sim package instead of pip. Download and extract the Isaac Sim pre-built package. Binary installs must use Isaac Sim’s bundled Python; combining them with conda, uv, or venv is unsupported. If you need a dedicated Python environment, use Python environment with Isaac Sim instead.

The commands below assume the package was extracted to ${HOME}/isaacsim on Linux or C:\isaacsim on Windows. Set the installation paths and verify the simulator:

export ISAACSIM_PATH="${HOME}/isaacsim"
export ISAACSIM_PYTHON_EXE="${ISAACSIM_PATH}/python.sh"
${ISAACSIM_PATH}/isaac-sim.sh
${ISAACSIM_PYTHON_EXE} -c "print('Isaac Sim configuration is now complete.')"
${ISAACSIM_PYTHON_EXE} ${ISAACSIM_PATH}/standalone_examples/api/isaacsim.core.experimental.api/add_cubes.py
set ISAACSIM_PATH="C:\isaacsim"
set ISAACSIM_PYTHON_EXE="%ISAACSIM_PATH:"=%\python.bat"
%ISAACSIM_PATH%\isaac-sim.bat
%ISAACSIM_PYTHON_EXE% -c "print('Isaac Sim configuration is now complete.')"
%ISAACSIM_PYTHON_EXE% %ISAACSIM_PATH%\standalone_examples\api\isaacsim.core.experimental.api\add_cubes.py

Caution

If you used an earlier Isaac Sim version, reset its user data and cached variables before the first launch: ${ISAACSIM_PATH}/isaac-sim.sh --reset-user on Linux or %ISAACSIM_PATH%\isaac-sim.bat --reset-user on Windows.

Clone Isaac Lab, create the _isaac_sim link, install, and verify:

git clone git@github.com:isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab
git clone https://github.com/isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab
cd IsaacLab
ln -s ${ISAACSIM_PATH} _isaac_sim
sudo apt install cmake build-essential
./isaaclab.sh -i
./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --viz kit
cd IsaacLab
mklink /D _isaac_sim %ISAACSIM_PATH%
isaaclab.bat -i
isaaclab.bat -p scripts\tutorials\00_sim\create_empty.py --viz kit

The tutorial command should open a black simulator viewport. If either verification command fails, consult the Isaac Sim Linux troubleshooting guide or the Isaac Sim forums.

Build Isaac Sim from source#

Build Isaac Sim from source only when you need to modify it or test a nightly revision. Building requires Ubuntu 22.04 or newer on Linux. For driver requirements, see the technical requirements. On Windows, enable long-path support before building.

Choose how to connect the Isaac Sim source build to Isaac Lab:

Clone Isaac Sim next to the Isaac Lab checkout. From the Isaac Lab root, run the source-build command. It incrementally builds Isaac Sim and links the live release tree as _isaac_sim:

git clone https://github.com/isaac-sim/IsaacSim.git ../IsaacSim
uv run isaaclab --isaacsim_source ../IsaacSim

Isaac Lab runs the active uv environment through Isaac Sim’s generated Python launcher. This loads Kit and extensions directly from the source build without creating wheels or changing pyproject.toml and uv.lock. Run Isaac Lab against the source build with:

uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Direct physics=isaacsim_physx

After changing Isaac Sim source, run the same --isaacsim_source command again. The native build is incremental, and the link continues to expose the updated build immediately; no wheel packaging or dependency resolution step is required.

Build and verify Isaac Sim for your platform:

git clone https://github.com/isaac-sim/IsaacSim.git
cd IsaacSim
./build.sh
export ISAACSIM_PATH="${PWD}/_build/linux-x86_64/release"
export ISAACSIM_PYTHON_EXE="${ISAACSIM_PATH}/python.sh"
${ISAACSIM_PATH}/isaac-sim.sh
${ISAACSIM_PYTHON_EXE} -c "print('Isaac Sim configuration is now complete.')"
${ISAACSIM_PYTHON_EXE} ${ISAACSIM_PATH}/standalone_examples/api/isaacsim.core.experimental.api/add_cubes.py
git clone https://github.com/isaac-sim/IsaacSim.git
cd IsaacSim
./build.sh
export ISAACSIM_PATH="${PWD}/_build/linux-aarch64/release"
export ISAACSIM_PYTHON_EXE="${ISAACSIM_PATH}/python.sh"
${ISAACSIM_PATH}/isaac-sim.sh
${ISAACSIM_PYTHON_EXE} -c "print('Isaac Sim configuration is now complete.')"
${ISAACSIM_PYTHON_EXE} ${ISAACSIM_PATH}/standalone_examples/api/isaacsim.core.experimental.api/add_cubes.py
git clone https://github.com/isaac-sim/IsaacSim.git
cd IsaacSim
build.bat
set ISAACSIM_PATH="%cd%\_build\windows-x86_64\release"
set ISAACSIM_PYTHON_EXE="%ISAACSIM_PATH:"=%\python.bat"
%ISAACSIM_PATH%\isaac-sim.bat
%ISAACSIM_PYTHON_EXE% -c "print('Isaac Sim configuration is now complete.')"
%ISAACSIM_PYTHON_EXE% %ISAACSIM_PATH%\standalone_examples\api\isaacsim.core.experimental.api\add_cubes.py

Return to the workspace containing the IsaacSim checkout, then clone Isaac Lab:

cd ..
git clone git@github.com:isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab
git clone https://github.com/isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab

Link Isaac Lab to the source build, install, and verify:

cd IsaacLab
ln -s ${ISAACSIM_PATH} _isaac_sim
sudo apt install cmake build-essential
./isaaclab.sh -i
./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --viz kit
cd IsaacLab
ln -s ${ISAACSIM_PATH} _isaac_sim
sudo apt install cmake build-essential python3.12-dev libgl1-mesa-dev libx11-dev \
   libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev
./isaaclab.sh -i
./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py --viz kit
cd IsaacLab
mklink /D _isaac_sim %ISAACSIM_PATH%
isaaclab.bat -i
isaaclab.bat -p scripts\tutorials\00_sim\create_empty.py --viz kit

The tutorial command should open a black simulator viewport. Use the binary-installation troubleshooting links above if the source build does not launch.

Docker containers#

Docker packages Isaac Lab and its dependencies into a reusable environment. docker/container.py is the main entry point for running Isaac Lab in a container. It wraps docker compose so that you do not have to remember which Dockerfile, environment files, and volume mounts belong together – you name a profile, and the script assembles the rest.

For remote execution, see Running on HPC Clusters and Cloud Deployment.

Clone Isaac Lab before running the container commands below:

git clone git@github.com:isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab
git clone https://github.com/isaac-sim/IsaacLab.git --branch release/3.0.0
cd IsaacLab

Caution

The standard Isaac Lab container depends on the Isaac Sim Docker image. By running that container, you are implicitly agreeing to the NVIDIA Software License Agreement. If you do not agree to the EULA, do not run that container. The kitless image contains neither Isaac Sim nor Kit.

Prerequisites#

Install Docker Engine, Docker Compose, and the NVIDIA Container Toolkit. The container is tested with Docker Engine 26.0.0 and Docker Compose 2.25.0; use these versions or newer. Follow the post-installation steps so that Docker runs without sudo.

The Isaac Sim documentation on container installation covers the same prerequisites in more detail, including how to obtain access to the Isaac Sim image.

Note

Due to limitations with snap, please make sure the Isaac Lab directory is placed under the /home directory tree when using docker.

Container profiles#

A profile is a Docker Compose profile: docker-compose.yaml tags each service with one, and Compose starts only the services whose profile is active. Naming a profile therefore selects a matched set – one service, one Dockerfile, one set of environment files, and one image name:

Profile

Compose service

Dockerfile

Environment files

Built on top of

base

isaac-lab-base

Dockerfile.base

.env.base

the Isaac Sim image

ros2

isaac-lab-ros2

Dockerfile.ros2

.env.base + .env.ros2

the base image, built first

kitless

isaac-lab-kitless

Dockerfile.kitless

.env.kitless

nothing – standalone, no Isaac Sim

Every command below takes the profile as its first positional argument and defaults to base. Only one profile applies at a time, and the resulting image and container are both named isaac-lab-<profile>. Pass --suffix to append a name suffix when you want several variants of the same profile side by side. Do not use --suffix with cluster deployments, whose export commands expect the unsuffixed image name.

For what each image actually contains and how to choose between them, see Container images.

Start, run, and retrieve results#

From the repository root on the host, build and start the default base container, then open a shell in it. Append a profile to target a different image:

./docker/container.py start
./docker/container.py enter

Inside the container, run the logging example without a visualizer:

uv run isaaclab -p scripts/tutorials/00_sim/log_time.py --viz none

The script writes simulation time at each step to /workspace/isaaclab/logs/docker_tutorial/log.txt. Stop the script with Ctrl+C and type exit to return to the host shell. Retrieve the results before stopping the container:

./docker/container.py copy
./docker/container.py stop

The log is now at docker/artifacts/logs/docker_tutorial/log.txt on the host. The stop command removes the container and its Compose-managed volumes, including logs and caches; copy out anything you need first. The image remains. To remove it after stopping, run docker image rm isaac-lab-base; the next start rebuilds it. See Docker pruning for other cleanup options.

Code for log_time.py
 1# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
 2# All rights reserved.
 3#
 4# SPDX-License-Identifier: BSD-3-Clause
 5
 6"""
 7This script demonstrates how to generate log outputs while the simulation plays.
 8It accompanies the tutorial on docker usage.
 9
10.. code-block:: bash
11
12    # Usage
13    uv run python scripts/tutorials/00_sim/log_time.py
14
15"""
16
17"""Parse the command-line arguments first."""
18
19
20import argparse
21import os
22
23from isaaclab.app import add_launcher_args, launch_simulation
24
25# create argparser
26parser = argparse.ArgumentParser(description="Tutorial on creating logs from within the docker container.")
27# append simulation launcher cli args
28add_launcher_args(parser)
29# parse the arguments
30args_cli = parser.parse_args()
31
32"""Rest everything follows."""
33
34from isaaclab.sim import SimulationCfg, SimulationContext
35
36
37def main():
38    """Main function."""
39    # Specify that the logs must be in logs/docker_tutorial
40    log_dir_path = os.path.join("logs")
41    if not os.path.isdir(log_dir_path):
42        os.mkdir(log_dir_path)
43    # In the container, the absolute path will be
44    # /workspace/isaaclab/logs/docker_tutorial, because
45    # all Python execution is done through the uv-managed workspace
46    # and the calling process' path will be /workspace/isaaclab
47    log_dir_path = os.path.abspath(os.path.join(log_dir_path, "docker_tutorial"))
48    if not os.path.isdir(log_dir_path):
49        os.mkdir(log_dir_path)
50    print(f"[INFO] Logging experiment to directory: {log_dir_path}")
51
52    # Configure the simulation
53    sim_cfg = SimulationCfg(dt=0.01, device=args_cli.device)
54    # Launch the simulator runtime that the configuration needs
55    with launch_simulation(sim_cfg, args_cli):
56        # Initialize the simulation context
57        sim = SimulationContext(sim_cfg)
58        # Set main camera
59        sim.set_camera_view([2.5, 2.5, 2.5], [0.0, 0.0, 0.0])
60
61        # Play the simulator
62        sim.reset()
63        # Now we are ready!
64        print("[INFO]: Setup complete...")
65
66        # Prepare to count sim_time
67        sim_dt = sim.get_physics_dt()
68        sim_time = 0.0
69
70        # Open logging file
71        with open(os.path.join(log_dir_path, "log.txt"), "w") as log_file:
72            # Simulate physics
73            while sim.is_running():
74                log_file.write(f"{sim_time}" + "\n")
75                # perform step
76                sim.step()
77                sim_time += sim_dt
78
79
80if __name__ == "__main__":
81    # run the main function
82    main()

Note

The image copies the repository to /workspace/isaaclab at build time, so edits made after the build are not picked up automatically. To keep the development loop fast, the compose file bind-mounts source, scripts, docs, and tools from the host, so changes to those directories appear inside the container immediately. Everything else requires a rebuild.

container.py command reference#

Run ./docker/container.py --help to list commands and ./docker/container.py <command> --help for that command’s arguments.

Command

Description

build

Build the image without creating a container.

start

Build the image and start the container in the background.

enter

Open a Bash shell in the running container.

config

Print the merged Compose configuration. Use --output-yaml <path> to write it to a file instead.

copy

Copy logs, data, and built documentation to docker/artifacts on the host.

stop

Stop and remove the container and its Compose-managed volumes.

Every command accepts the following arguments:

Argument

Description

profile

Optional profile name; defaults to base. Other profiles are ros2 and kitless.

--files [FILE ...]

Merge additional Compose YAML files after docker-compose.yaml, in the supplied order.

--env-files [FILE ...]

Merge additional environment files after the profile defaults, in the supplied order.

--suffix [SUFFIX]

Append -SUFFIX to the image and container names. Omit it for unsuffixed names.

--info

Print the resolved container interface configuration instead of running the command.

-h, --help

Show help and exit.

Extending the Compose configuration#

--files and --env-files merge extra Compose and environment files into the generated configuration, which is how optional components are layered on without editing the checked-in files. Streaming to XR devices is the worked example – it adds the CloudXR Runtime service alongside base:

./docker/container.py start --files docker-compose.cloudxr-runtime.patch.yaml --env-files .env.cloudxr-runtime

Stop it with the same arguments. The teleoperation setup, firewall rules, and client connection steps are covered in Setting up Isaac Capture with CloudXR. Use ./docker/container.py config to print the merged result when a combination does not behave as expected.

What persists between runs#

The compose file declares named volumes for Isaac Sim caches, logs, and your own data. They remain available while reusing a container, but container.py stop runs docker compose down --volumes and removes them. Run container.py copy before stop to preserve your results on the host.

container.py copy extracts the three volumes you are most likely to want on the host – logs, data_storage, and docs/_build – into docker/artifacts. For anything else, use docker cp, for example docker cp isaac-lab-base:/workspace/isaaclab/logs ..

If you are upgrading from an Isaac Lab image that ran as root, the existing volumes still hold root-owned files that the current uid/gid 1000 runtime user cannot write. Copy out anything worth keeping, then recreate them from the docker directory:

docker compose --file docker-compose.yaml --profile base --env-file .env.base down --volumes
All named volumes and their container paths

Volume Name

Description

Container Path

isaac-cache-kit

Stores cached Kit resources

/isaac-sim/kit/cache

isaac-data-kit

Stores Kit data

/isaac-sim/kit/data

isaac-cache-ov

Stores cached OV resources

/root/.cache/ov

isaac-cache-pip

Stores cached pip resources

/root/.cache/pip

isaac-cache-gl

Stores cached GLCache resources

/root/.cache/nvidia/GLCache

isaac-cache-compute

Stores cached compute resources

/root/.nv/ComputeCache

isaac-cache-uv

Stores uv downloads for the kit-less profile

/home/isaaclab/.cache/uv

isaac-cache-warp

Stores Warp kernels for the kit-less profile

/home/isaaclab/.cache/warp

isaac-logs

Stores logs generated by Omniverse

/root/.nvidia-omniverse/logs

isaac-carb-logs

Stores logs generated by carb

/isaac-sim/kit/logs/Kit/Isaac-Sim

isaac-data

Stores data generated by Omniverse

/root/.local/share/ov/data

isaac-docs

Stores documents generated by Omniverse

/root/Documents

isaac-lab-docs

Stores documentation of Isaac Lab when built inside the container

/workspace/isaaclab/docs/_build

isaac-lab-logs

Stores logs generated by Isaac Lab workflows when run inside the container

/workspace/isaaclab/logs

isaac-lab-data

Stores whatever data users may want to preserve between container runs

/workspace/isaaclab/data_storage

Run docker volume ls on the host to find the actual names, which include the Compose project prefix, then use docker volume inspect <volume-name>. The kitless profile uses the uv and Warp caches and shares the documentation, logs, and data volumes with the others.

Display forwarding with X11#

X11 forwarding lets GUI applications started inside the container display on the host. The first start asks whether to enable it and records the answer in docker/.container.cfg. To change it later, set X11_FORWARDING_ENABLED to 0 or 1 in that file and run start again – the rebuild is what applies the change.

Container images#

Each profile builds a different image. They differ in what simulation and rendering stack they carry, which decides how large they are and what they can run. This section describes the images themselves; to build or run one, name its profile in the container lifecycle.

Choosing an image#

Profile

Contains

Use it when

base

Isaac Lab on the NVIDIA Isaac Sim image, with Kit and RTX rendering

You want the default environment, GUI rendering, or anything that needs Isaac Sim

ros2

The base image plus ROS 2 Humble

You are bridging Isaac Lab to ROS 2 nodes

kitless

Ubuntu 24.04, Python 3.12, Newton and OVPhysX physics, OVRTX rendering, four RL libraries

You are training with Newton and want the smallest image; also the only one with no Isaac Sim EULA

Building an image#

Every image builds with the same command; only the profile name changes. From the repository root, build the image for a profile from the table above, for example kitless:

./docker/container.py build kitless

./docker/container.py start kitless also builds the image before starting the container. Without Compose, build the profile’s Dockerfile directly; it uses the same default paths:

docker build --pull --file docker/Dockerfile.kitless --tag isaac-lab-kitless .

Release images are also published pre-built, so building is optional; see Pre-built image from NGC.

Base image#

Dockerfile.base overlays Isaac Lab’s dependencies onto the Isaac Sim container, so it inherits Kit, RTX rendering, and the Isaac Sim asset pipeline. The Isaac Sim version it builds against is set by ISAACSIM_VERSION in .env.base; the other variables in that file control paths inside the container.

ROS 2 image#

Dockerfile.ros2 installs ROS 2 Humble from an apt package and sources it in the runtime user’s .bashrc. ROS2_APT_PACKAGE in .env.ros2 selects the package set, defaulting to ros-base. The image defaults to the FastRTPS middleware; CycloneDDS is also supported, and both can be tuned through their .xml files under docker/.ros. See various middleware for the trade-offs.

Parameters in .env.ros2
###
# ROS2 specific settings
###
# Set the version of the ROS2 apt package to install (ros-base, desktop, desktop-full)
ROS2_APT_PACKAGE=ros-base
# Set ROS2 middleware implementation to use (e.g. rmw_fastrtps_cpp, rmw_cyclonedds_cpp)
RMW_IMPLEMENTATION=rmw_fastrtps_cpp
# Path to fastdds.xml file to use (only needed when using fastdds)
FASTRTPS_DEFAULT_PROFILES_FILE=${DOCKER_USER_HOME}/.ros/fastdds.xml
# Path to cyclonedds.xml file to use (only needed when using cyclonedds)
CYCLONEDDS_URI=${DOCKER_USER_HOME}/.ros/cyclonedds.xml
# Docker image and container name suffix (default "", set by the container_interface.py script)
# Example: "-custom"
DOCKER_NAME_SUFFIX=""

Kit-less image#

The kit-less image drops Isaac Sim entirely and builds on Ubuntu 24.04 with Python 3.12. It carries Newton physics, OVPhysX physics, OVRTX rendering, and the four core RL frameworks: RL Games, RSL-RL, Stable-Baselines3, and SKRL. The newton_gl, newton_rtx, viser, and rerun visualizers are included. Use --viz newton_gl for local visualization with a display available in the container. --viz newton_gl selects the OpenGL rasterizer; --viz newton_rtx selects the OVRTX path tracer. Both can render offscreen without Isaac Sim. To open their windows from a direct docker run, run xhost +local: on the host and add -e DISPLAY and -v /tmp/.X11-unix:/tmp/.X11-unix:rw to the command below. The deprecated --viz newton alias selects GL; it does not choose between GL and RTX automatically.

Rendering needs NVIDIA graphics driver capabilities in addition to compute. For direct docker run commands, pass --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all. The NVIDIA Container Toolkit exposes the host driver; avoid mounting a second copy of its Vulkan ICD. If multiple drivers are discovered, select the NVIDIA ICD available inside the container with VK_DRIVER_FILES (for example, /etc/vulkan/icd.d/nvidia_icd.json).

No visualizer is selected by default, so training runs headless unless you ask for one. The kit visualizer is the exception: it comes from Omniverse Kit, which this image does not contain.

Unlike the other two, it bind-mounts apps in addition to source, scripts, tools, and docs, and it keeps a uv cache and a Warp cache of its own.

You do not have to build it locally. It is published alongside each Isaac Lab release in the same registry repository, distinguished by a -kitless tag suffix:

docker pull nvcr.io/nvidia/isaac-lab:3.0.0-kitless

Running it directly, outside the Compose workflow, is a convenient way to verify the image and your NVIDIA Container Toolkit setup. --interactive and --tty keep the container’s shell alive so that several commands can share it. The isaac-lab-kitless-logs named volume keeps checkpoints after the container is removed:

docker run --name isaac-lab-kitless --detach --interactive --tty --gpus all --network host \
    -e NVIDIA_DRIVER_CAPABILITIES=all \
    -v isaac-lab-kitless-logs:/workspace/isaaclab/logs \
    nvcr.io/nvidia/isaac-lab:3.0.0-kitless

docker exec isaac-lab-kitless \
    isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Direct \
    --num_envs 16 presets=newton_mjwarp --max_iterations 5

Replay in a browser with:

docker exec --interactive --tty isaac-lab-kitless \
    isaaclab play --rl_library rsl_rl --task Isaac-Cartpole-Direct \
    --num_envs 16 presets=newton_mjwarp --checkpoint latest --viz viser

Viser is reachable through the host network without forwarding a desktop display. Stop playback with Ctrl+C without stopping the container. Copy the logs to the host with docker cp isaac-lab-kitless:/workspace/isaaclab/logs ./logs.

Check which architectures a tag publishes with docker buildx imagetools inspect <image:tag> before choosing a host.

Pre-built image from NGC#

A minimal pre-built container carries a small set of Isaac Sim and Omniverse dependencies with Isaac Lab already built in, under /workspace/isaaclab. The example below runs without a forwarded desktop display. Choose the image profile for the physics and rendering stack you need, and configure graphics access separately when rendering.

Note

Use an explicit published version tag for reproducible runs. The examples below use 3.0.0; the corresponding kit-less image uses 3.0.0-kitless.

Attention

Images from 3.0.0-beta2 onward run as a non-root user, so those bind-mount directories must be writable by uid/gid 1000. Docker creates any missing one as root, which the runtime user cannot write to, producing errors such as PermissionError: [Errno 13] Permission denied: '/root/.local/share/ov/data/exts'. Create them first:

mkdir -p ~/docker/isaac-sim/{cache/kit,cache/ov,cache/pip,cache/glcache,cache/computecache,logs,data,documents}
sudo chown -R 1000:1000 ~/docker/isaac-sim

Because it is run outside Compose, the Isaac Sim cache directories have to be mounted by hand, otherwise every start recompiles shaders:

docker run --name isaac-lab --entrypoint bash -it --gpus all -e "ACCEPT_EULA=Y" --rm --network=host \
   -e "PRIVACY_CONSENT=Y" \
   -v ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache:rw \
   -v ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw \
   -v ~/docker/isaac-sim/cache/pip:/root/.cache/pip:rw \
   -v ~/docker/isaac-sim/cache/glcache:/root/.cache/nvidia/GLCache:rw \
   -v ~/docker/isaac-sim/cache/computecache:/root/.nv/ComputeCache:rw \
   -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \
   -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \
   -v ~/docker/isaac-sim/documents:/root/Documents:rw \
   nvcr.io/nvidia/isaac-lab:3.0.0

The command above opens no windows: without a display, --viz kit, --viz newton_gl, and --viz newton_rtx run headless. The viser and rerun visualizers serve a web page instead and need no display. To enable rendering through X11 forwarding, let local clients use the host X server and pass the display into the container:

xhost +local:
docker run --name isaac-lab --entrypoint bash -it --gpus all -e "ACCEPT_EULA=Y" --rm --network=host \
   -e "PRIVACY_CONSENT=Y" \
   -e DISPLAY \
   -e MUJOCO_GL=disable \
   -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
   -v ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache:rw \
   -v ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw \
   -v ~/docker/isaac-sim/cache/pip:/root/.cache/pip:rw \
   -v ~/docker/isaac-sim/cache/glcache:/root/.cache/nvidia/GLCache:rw \
   -v ~/docker/isaac-sim/cache/computecache:/root/.nv/ComputeCache:rw \
   -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \
   -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \
   -v ~/docker/isaac-sim/documents:/root/Documents:rw \
   nvcr.io/nvidia/isaac-lab:3.0.0

xhost +local: lets every local client use your display, not only the container; run xhost -local: on the host to revoke it when you are done. MUJOCO_GL=disable is needed by the Newton viewers in images released before it was set in the image: those inherit MUJOCO_GL=egl, which fails the windowed viewer with Attempt to retrieve context when no valid context. The Compose workflow sets up X11 forwarding for you; see Docker containers. Follow the graphics-driver requirements above for GL or RTX.

Runtime user#

The base, ROS 2, cuRobo, and kit-less images all run as a non-root user with uid/gid 1000. When running one of these images directly with docker run, keep that default user instead of passing --user, so that the runtime home and cache directories stay writable. Named volumes inherit the image’s ownership; make host bind mounts writable with sudo chown -R 1000:1000 <directory>.

Python interpreter#

Every image installs from uv.lock into a Python 3.12 virtual environment at /opt/isaaclab-venv. On the Isaac Sim-based images the environment is built on Isaac Sim’s own interpreter, and Isaac Sim itself stays outside it, reached through the _isaac_sim symlink; isaaclab.sh puts it on the path. In either case python on the container’s PATH resolves to the right one, so scripts are run the same way regardless of image.

Cloud workstations#

Isaac Automator provisions GPU workstations on AWS, GCP, Azure, and Alibaba Cloud. Install Docker, then clone and build Isaac Automator:

git clone https://github.com/isaac-sim/IsaacAutomator.git
cd IsaacAutomator
./build
./run ./deploy-aws

Replace deploy-aws with deploy-gcp, deploy-azure, or deploy-alicloud. Use --isaaclab and --isaacsim to select Git revisions. Connection details for SSH, noVNC, and NoMachine are stored in state/<deployment-name>/info.txt.

Manage the workstation from the Automator container:

./stop <deployment-name>
./start <deployment-name>
./upload <deployment-name>
./download <deployment-name>
./destroy <deployment-name>

Preserve the state directory because it contains the deployment metadata.

See Cloud Deployment for credentials, provider options, connection methods, data transfer, and the complete workstation lifecycle.

Next steps#

Continue with the quickstart to run a task and train a policy. For asset caching, Nucleus migration, and regional asset services, see Manage Asset Downloads. For setup, launch, and performance problems, use the troubleshooting reference.