Docker containers. Lighter and faster than VMs; preferred for workstation hosts.
private: true hides from learners — for backend-only services. entrypoint: bash overrides image default and pairs naturally with shell: /bin/bash.
Full Linux or Windows VMs. Required for kernel features, GUIs, nested virtualization.
machine_type: over memory:+cpus:. Canonical sizing knob across most workshop-image families and partner-published custom images.
Pre-pointed browser tabs. URL accepts ${_SANDBOX_ID} interpolation, internal hostnames, or external URLs.
[[ Instruqt-Var ]] in the assignment body.
Provisioned AWS account. Credentials auto-injected as INSTRUQT_AWS_ACCOUNT_<NAME>_*.
iam_policy (narrow) plus admin_iam_policy (broad) for setup. secrets: is the BYOC alternative when no provisioned account is needed.
Provisioned Azure subscription. services: are resource provider namespaces — pre-registered before handoff.
ARM_CLIENT_ID / ARM_CLIENT_SECRET / ARM_TENANT_ID / ARM_SUBSCRIPTION_ID are injected automatically.
Provisioned GCP project. services: are API names. SA key arrives base64-encoded.
echo $INSTRUQT_GCP_PROJECT_LAB_SERVICE_ACCOUNT_KEY | base64 -d > /tmp/sa.json. Pair with trap "rm -f /tmp/sa.json" EXIT.
Named secrets injected as environment variables on every container and VM. Values set in the Instruqt platform UI, never in the source tree.
environment: on a resource lives in the source tree forever and appears in the learner's debug log. SSH keys, API tokens, license keys, registry credentials — all belong here, not in environment: or in lifecycle scripts.
name: uppercased with hyphens replaced by underscores. name: my-lab → prefix INSTRUQT_AWS_ACCOUNT_MY_LAB_.config.yml. Telltale: a cluster of credential secrets: with no matching cloud account block.secrets: values inside any of them.