The top-level .env file sets Docker Compose interpolation variables — image tags, profile selection, replica counts, and per-container launch switches. These variables do not automatically become environment variables inside the containers: a variable only reaches a container if a compose file forwards it through an environment: entry (see each Consumed by column). airstack up reads .env automatically; launch-intent flags (--sim, --robots, --stack, ...) override it by exporting the same variables before compose runs. This page is the complete schema; the Docker guide summarizes the subset forwarded into robot containers, and the Configuration overview explains where non-compose configuration lives.
These variables assemble every image tag as ${PROJECT_DOCKER_REGISTRY}/${PROJECT_NAME}:v${VERSION}_<service-suffix> (robot images additionally append _${DOCKER_IMAGE_BUILD_MODE}).
Variable
Purpose
Default
Consumed by
PROJECT_NAME
Repository name for Docker images and part of every image tag
"airstack"
image: tags in all compose files (robot/docker/, gcs/docker/, simulation/*/docker/)
VERSION
Semver image version; bumped per release, so the value in .env is always the current release (e.g. 0.21.0-dev.15)
current release semver
image: tags in all compose files; CI version gate (check-version-increment.yml)
DOCKER_IMAGE_BUILD_MODE
Image-tag discriminator only — no Dockerfile consumes it. Keep dev (mounted code, built live); a real prebuilt workspace-baked stage is future work
"dev"
Tag suffix of the robot images (robot/docker/docker-compose.yaml)
PROJECT_DOCKER_REGISTRY
Registry to push/pull images from
"airlab-docker.andrew.cmu.edu/airstack"
image: tags in all compose files
COMPOSE_PROFILES
Default compose profiles when none are passed explicitly
"desktop,isaac-sim"
Docker Compose profile selection; rewritten by airstack up --sim <sim> (swaps the simulator profile) and --fleet (heterogeneous fleets swap desktop for fleet)
If false, containers spawn idle with no launch command (tmux session still created)
"true"
Container command: of every robot service, isaac-sim, ms-airsim, and gcs (each gates its tmux autolaunch on it)
NUM_ROBOTS
Number of robot containers to launch (compose replicas)
"1"
deploy.replicas of robot-desktop/robot-offboard; forwarded into isaac-sim, ms-airsim, and gcs containers (drone spawn count / peer list). Overridden by airstack up --robots N; derived from the fleet file with --fleet
RECORD_BAGS
Start the bag recorder node with the stack (see Rosbags)
"false"
robot_base and gcsenvironment: → bag_recorder_pid via the logging bringup
ros2 launch isaacsim run_isaacsim.launch.py gui:=... branch of the isaac-sim command (only when ISAAC_SIM_USE_STANDALONE is not true)
ISAAC_SIM_USE_STANDALONE
true = launch Isaac Sim via a standalone Python script; false = load the ISAAC_SIM_GUI USD file via run_isaacsim.launch.py
"true"
Branch selector in the isaac-sim container command
ISAAC_SIM_SCRIPT_NAME
Standalone launch script, resolved under /AirStack/simulation/isaac-sim/launch_scripts/. The default spawns exactly one drone; multi-robot needs example_multi_px4_pegasus_launch_script.py (auto-selected by airstack up --robots N>1) and fleets use fleet_spawn.py (auto-selected by --fleet)
"example_one_px4_pegasus_launch_script.py"
Standalone branch of the isaac-sim container command
PLAY_SIM_ON_START
Start the sim playing instead of paused (airstack up --no-play to come up paused)
"true"
isaac-simenvironment: → the Pegasus launch scripts (pegasus_app.py and the example scripts); passed as play_sim_on_start:= in the USD launch path
Mapping file (in robot/docker/robot_name_map/) that resolves each container to ROBOT_NAME + ROS_DOMAIN_ID — see Robot Identity
"default_robot_name_map.yaml"
robot_baseenvironment: → resolve_robot_name.py, run by robot/docker/.bashrc at container startup
URDF_FILE
Robot description, relative to the workspace robot_descriptions/ install. Swapped automatically by airstack up --sim isaac\|airsim to the matching sensor URDF
Base UDP port for onboard MAVLink streams, offset per robot
14580
Same as above
Variables Exported by airstack up (Not Set in .env)¶
airstack up parses its launch-intent flags (parse_launch_intent / apply_launch_intent in airstack.sh) and exports these before invoking compose. Set them by flag, not by editing .env — though explicit env / --env-file values take precedence (leaf-value precedence, with an override banner for fleet conflicts).
Variable
Set by
Purpose
Consumed by
AIRSTACK_STACK_DIR
--stack <name> (always exported; no stack = /root/AirStack/stacks/full_default)
Container path of the stack folder whose entry launch file defines the autonomy topology — see Stacks