Azure · Your First Blob Storage Lab
Use the Azure CLI environment for a safe storage lifecycle with explicit cleanup.
What you'll build
Before You Build
2 quick questions. This is diagnostic only — it does not block the lesson.
What must be confirmed before creating Azure resources?
Why use a unique resource name?
Mission
Use Azurite and the isolated Azure CLI container to complete one local Blob Storage lifecycle, see it in the ENJYRA console, and prove cleanup.
LOCAL AZURE SIMULATION · NO CLOUD ACCOUNT
This lab runs only in lesson-scoped Docker containers on your machine. Azurite provides local Blob Storage; the resource-group and subscription labels in the console are educational representations, not Azure Resource Manager.
Understand
Azurite emulates Blob Storage for this lesson, and the ENJYRA console reads its real container and blob state. The target local lifecycle is: create container → upload → list → download → delete blob → delete container. The concepts transfer to Azure, but this is not the Azure portal.
Build
You will launch the Azure Local Lab, create a blob container through the same wizard a real Azure engineer’s portal mirrors (Public access level, an Access Control role, a Security Review), upload and inspect a blob, deliberately weaken then restore the container’s public access, and confirm the Activity Log.
Start Azurite and the official ENJYRA Azure console for this lesson only.
Every later step reads and writes the same Azurite state the console shows you.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure start./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure start.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure startBefore You Run
- Your terminal is open in enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Starts Azurite and the official ENJYRA Azure console container, both scoped to this lesson.
Command Breakdown
ENJYRA launcher · AZURE · start- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its start action.
Expected Result
ENJYRA azure local lab is starting.
Console: http://localhost:8082What Changed
BeforeThe requested local service or lab containers are not yet confirmed running.
AfterThe local service or lab containers are running in the background and can be verified.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
Both the emulator and ENJYRA console should report healthy.
If It Fails
- Run the status command below. If the console is not healthy, check that Docker Desktop is running.
What this command does Starts Azurite and the official ENJYRA Azure console container, both scoped to this lesson.
ENJYRA azure local lab is starting.
Console: http://localhost:8082If it fails
Run the status command below. If the console is not healthy, check that Docker Desktop is running.
Open http://localhost:8082 and confirm the header shows ✓ Official ENJYRA Lab and ● Running locally. This is the ENJYRA Azure Local Lab, not the real Azure portal.
What’s happening behind the scenes?
Official ENJYRA image: enjyra/azure-labs · Release: console-0.1.1 · Platforms: linux/amd64, linux/arm64. Docker Compose reads compose/azure.compose.yml, pulls this image plus the upstream Azurite emulator, and starts both.
The Azure Local Lab console becomes reachable at http://localhost:8082. Docker Compose pulls the official enjyra/azure-labs image automatically — you do not need to run docker pull yourself.
Confirm both containers are healthy before continuing.
Catching a startup problem here is easier than debugging it three steps later.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure statusBefore You Run
- Your terminal is open in enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Lists the two containers for this lab and their health.
Command Breakdown
ENJYRA launcher · AZURE · status- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its status action.
Expected Result
enjyra-azure-b02 Up (healthy)
enjyra-azure-b02-console Up (healthy)What Changed
BeforeThe current state has not yet been checked.
AfterNo persistent state changed; the command printed evidence you can compare with the expected result.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
Run the command and compare its output with the Expected Result block.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Lists the two containers for this lab and their health.
enjyra-azure-b02 Up (healthy)
enjyra-azure-b02-console Up (healthy)Nothing — this only reads status.
Choose names and account-level settings before creating the hierarchy.
Azure Blob Storage is organised as Storage Account → Blob Container → Blob. Region, redundancy, versioning, and soft-delete protection belong to the storage account; each container inherits them.
Local storage account context: enjyrastoragedev
Region: UK South — uksouth
Redundancy: ZRS
Container name: enjyra-documents
Public access: Private — no anonymous access
Create and automatically select a local storage account context, choose its region and redundancy, keep all protection controls enabled with 7-day retention, then create the container under that selected account.
In Azure, the storage account—not each blob container—owns the region and protection settings. Every container inherits them.
Console path: Storage Accounts → + Create local storage account → enter enjyrastoragedev → Region UK South → Redundancy ZRS → keep Blob Versioning, Blob Soft Delete, and Container Soft Delete checked → Retention 7 days → Create account context.
The new context is selected automatically. Existing storage account names are read-only; create another context instead of trying to rename one.
Container path: Blob Containers → Storage Account enjyrastoragedev → Create Blob container → confirm the same account and its inherited Region, Redundancy, protection controls, and 7 days → enter enjyra-documents → keep Private selected → Review + create.
On the Review step, ENJYRA shows a live Security Review calculated from your actual choices. If you switch Public access to Blob or Container during the wizard, you will see an inline ⚠ warning immediately — try it, then switch back to Private before creating.
LOCAL LAB NOTE
The Azure Region and redundancy are educational account configuration. The container inherits them, but Azurite and every byte still run on your machine; selecting UK South does not place local data in a London data centre.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure cli container create --name enjyra-documents --public-access off./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure cli container create --name enjyra-documents --public-access off.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure cli container create --name enjyra-documents --public-access offBefore You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Creates the same container directly against Azurite, with public access off (private).
Command Breakdown
ENJYRA launcher · AZURE · cli- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its cli action.
Expected Result
created: trueWhat Changed
BeforeThe requested local resource or updated object state is not yet visible in the emulator.
AfterThe emulator now contains the requested resource or updated object state.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
Confirm the lab is healthy, then refresh the matching ENJYRA console to see the resource.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Creates the same container directly against Azurite, with public access off (private).
created: trueThe new local account context and container association are stored by ENJYRA; a real Azurite container is created with Private public access. Account location and protection are clearly labelled learning simulations because Azurite and all bytes remain local.
Click the container's name in Blob Containers to open its own page.
A real portal does not keep you on the list — each container has its own Blobs, Properties, Access Control and Activity views.
Console path: Blob Containers → enjyra-documents → Properties tab.
Confirm Public access reads private — read live from Azurite, not guessed by the console. Also confirm the owning account is enjyrastoragedev and the Region, Redundancy, versioning, soft-delete controls, and 7-day retention are shown as inherited account settings.
Nothing is created here; this reads the container's real state from Azurite.
Create a small text file and upload it to the container, from the console.
Blobs are what a container actually stores; uploading proves the container is usable, not just present.
mkdir -p compose/workspace/azure
printf "Hello ENJYRA\n" > compose/workspace/azure/enjyra-demo.txtmkdir -p compose/workspace/azure
printf "Hello ENJYRA\n" > compose/workspace/azure/enjyra-demo.txtNew-Item -ItemType Directory -Force -Path "compose\workspace\azure" | Out-Null
Set-Content -Path "compose\workspace\azure\enjyra-demo.txt" -Value "Hello ENJYRA"Before You Run
- Your terminal is open in enjyra-cloud-labs.
Why You're Running This
Creates the workspace folder if needed, then writes a one-line text file for this lesson.
Command Breakdown
mkdir -p / New-Item Directory- Creates the requested folder and any missing parent folders without failing when it already exists.
printf / Set-Content- Writes the specified text into the target file, replacing its previous contents when it already exists.
Expected Result
compose/workspace/azure/enjyra-demo.txt now exists in the lesson workspace and is ready for the next instruction.What Changed
Beforecompose/workspace/azure/enjyra-demo.txt may not exist yet, or may still contain its previous content.
Aftercompose/workspace/azure/enjyra-demo.txt now exists in the lesson workspace and is ready for the next instruction.
Verify It
macOSls -l compose/workspace/azure/enjyra-demo.txt
Linuxls -l compose/workspace/azure/enjyra-demo.txt
Windows PowerShellGet-Item "compose\workspace\azure\enjyra-demo.txt"
Confirm the file exists at the expected path.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
What this command does Creates the workspace folder if needed, then writes a one-line text file for this lesson.
Console path: Container detail → Blobs tab → Upload blob → choose enjyra-demo.txt.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure cli blob upload --container-name enjyra-documents --name enjyra-demo.txt --file /workspace/files/enjyra-demo.txt --overwrite./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure cli blob upload --container-name enjyra-documents --name enjyra-demo.txt --file /workspace/files/enjyra-demo.txt --overwrite.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure cli blob upload --container-name enjyra-documents --name enjyra-demo.txt --file /workspace/files/enjyra-demo.txt --overwriteBefore You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Uploads the same file directly through the Azure CLI.
Command Breakdown
ENJYRA launcher · AZURE · cli- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its cli action.
Expected Result
Finished[#############################################################] 100.0000%What Changed
BeforeThe requested local resource or updated object state is not yet visible in the emulator.
AfterThe emulator now contains the requested resource or updated object state.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
Confirm the lab is healthy, then refresh the matching ENJYRA console to see the resource.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Uploads the same file directly through the Azure CLI.
Finished[#############################################################] 100.0000%Whichever path you use, refresh the other: the CLI and the console Blobs tab both read the same Azurite container.
enjyra-demo.txt now exists inside enjyra-documents in Azurite.
On the Access Control tab, switch Public access to Container, save, observe the warning, then switch back to Private and save again.
Seeing a real ⚠ SECURITY WARNING appear — and clear — for a container you configured teaches the consequence of the setting better than reading about it.
Console path: Container detail → Access Control tab → select Container → Save changes.
Expect: ⚠ SECURITY WARNING — This container currently allows anonymous public access.
Now select Private and Save changes again. The warning disappears, confirming the fix took effect in Azurite.
Access control (RBAC) below the access-level toggle is a learning simulation
Azurite does not implement Microsoft Entra ID or Azure RBAC. The role you assign there is stored by the console only, and the evaluator lets you compare Reader, Contributor, and Owner decisions without claiming real enforcement. Public access above and the read-only Shared Access Signature generated on this tab are real, enforced Azurite operations.
Open Data Protection for a separate, clearly labelled recovery simulation covering Blob Versioning, Blob Soft Delete, and Container Soft Delete. Azurite 3.35.0 does not persist those account-level controls, so the exercise never changes or misrepresents the real blob state.
The container's real public access level in Azurite is changed, then changed back — this is a genuine Azurite Set Container ACL call, not a simulation.
Overwrite enjyra-demo.txt, inspect its previous version, delete the current blob, then restore the retained version with Restore / Make current.
Azure Blob Versioning preserves earlier versions after overwrite. Blob Soft Delete keeps a recoverable copy during the configured retention window.
printf "Hello ENJYRA v2\n" > compose/workspace/azure/enjyra-demo.txt
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure cli blob upload --container-name enjyra-documents --name enjyra-demo.txt --file /workspace/files/enjyra-demo.txt --overwriteprintf "Hello ENJYRA v2\n" > compose/workspace/azure/enjyra-demo.txt
./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure cli blob upload --container-name enjyra-documents --name enjyra-demo.txt --file /workspace/files/enjyra-demo.txt --overwriteSet-Content -Path "compose\workspace\azure\enjyra-demo.txt" -Value "Hello ENJYRA v2"
.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure cli blob upload --container-name enjyra-documents --name enjyra-demo.txt --file /workspace/files/enjyra-demo.txt --overwriteBefore You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Overwrites the live Azurite blob; ENJYRA records the earlier content as a simulated previous version.
Command Breakdown
printf / Set-Content- Writes the specified text into the target file, replacing its previous contents when it already exists.
ENJYRA launcher · AZURE · cli- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its cli action.
Expected Result
compose/workspace/azure/enjyra-demo.txt now exists in the lesson workspace and is ready for the next instruction.What Changed
Beforecompose/workspace/azure/enjyra-demo.txt may not exist yet, or may still contain its previous content.
Aftercompose/workspace/azure/enjyra-demo.txt now exists in the lesson workspace and is ready for the next instruction.
Verify It
macOSls -l compose/workspace/azure/enjyra-demo.txt
Linuxls -l compose/workspace/azure/enjyra-demo.txt
Windows PowerShellGet-Item "compose\workspace\azure\enjyra-demo.txt"
Confirm the file exists at the expected path.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Overwrites the live Azurite blob; ENJYRA records the earlier content as a simulated previous version.
Console path: Container detail → Versions → confirm CURRENT and PREVIOUS → Blobs → Delete → Deleted → confirm the 7-day recovery deadline → Restore / Make current.
The blob returns to Blobs as current and its history remains in Versions. The protection model is marked ◐ LEARNING SIMULATION; the live current blob itself is real Azurite state.
The restored content is uploaded back to real Azurite as the current blob, while ENJYRA's clearly labelled learning history retains every previous and soft-deleted version.
Open Activity Log from the sidebar and find the container, blob, access-level, and simulated recovery events you just caused.
The log distinguishes real Azurite operations from console-side learning simulations.
Confirm the log contains: the local storage-account context created and selected, storage account location selected, container created, blob uploaded, blob overwritten, blob deleted with its recovery window, and previous version promoted / restored. Access-level changes appear too.
Nothing — this only reads the log.
Break
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure cli container create --name INVALID_NAME./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure cli container create --name INVALID_NAME.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure cli container create --name INVALID_NAMEBefore You Run
- Your terminal is open in Current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
This creates or updates the resource in the same local emulator displayed by the ENJYRA console.
Command Breakdown
ENJYRA launcher · AZURE · cli- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its cli action.
Expected Result
InvalidResourceName
A deliberately invalid container name produces an understandable local Blob Storage error.What Changed
BeforeThe requested local resource or updated object state is not yet visible in the emulator.
AfterThe emulator now contains the requested resource or updated object state.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
Confirm the lab is healthy, then refresh the matching ENJYRA console to see the resource.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
InvalidResourceNameIf it fails
command not found → verify the required tool is installed and reopen the terminal.No such file or directory → check your current folder with pwd or Get-Location.Permission denied → confirm the lesson workspace is writable.Debug
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure logs./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure logs.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure logsBefore You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Checks status, then prints logs for only the Azure local lab. The connection string remains scoped to the local emulator.
Command Breakdown
ENJYRA launcher · AZURE · status- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its status action.
ENJYRA launcher · AZURE · logs- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its logs action.
Expected Result
No persistent state changed; the command printed evidence you can compare with the expected result.What Changed
BeforeThe current state has not yet been checked.
AfterNo persistent state changed; the command printed evidence you can compare with the expected result.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure logs
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure logs
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure logs
Run the command and compare its output with the Expected Result block.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Checks status, then prints logs for only the Azure local lab. The connection string remains scoped to the local emulator.
Improve
Add a second blob under a folder-style prefix, entirely through the CLI this time, then confirm the console Blobs tab agrees without a manual reload.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure cli blob upload --container-name enjyra-documents --name notes/readme.txt --file /workspace/files/enjyra-demo.txt --overwrite./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure cli blob upload --container-name enjyra-documents --name notes/readme.txt --file /workspace/files/enjyra-demo.txt --overwrite.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure cli blob upload --container-name enjyra-documents --name notes/readme.txt --file /workspace/files/enjyra-demo.txt --overwriteBefore You Run
- Your terminal is open in Current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
This creates or updates the resource in the same local emulator displayed by the ENJYRA console.
Command Breakdown
ENJYRA launcher · AZURE · cli- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its cli action.
Expected Result
Finished[#############################################################] 100.0000%
notes/readme.txt appears in the console's Blobs tab within a few seconds — the console polls Azurite, it does not require a page reload.What Changed
BeforeThe requested local resource or updated object state is not yet visible in the emulator.
AfterThe emulator now contains the requested resource or updated object state.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
Confirm the lab is healthy, then refresh the matching ENJYRA console to see the resource.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
Finished[#############################################################] 100.0000%If it fails
command not found → verify the required tool is installed and reopen the terminal.No such file or directory → check your current folder with pwd or Get-Location.Permission denied → confirm the lesson workspace is writable.Verify
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure cli blob list --container-name enjyra-documents --output table./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure cli blob list --container-name enjyra-documents --output table.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure cli blob list --container-name enjyra-documents --output tableBefore You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Lists both blobs so you can compare the CLI output with the console's Blobs tab and blob count.
Command Breakdown
ENJYRA launcher · AZURE · cli- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its cli action.
Expected Result
No persistent state changed; the command printed evidence you can compare with the expected result.What Changed
BeforeThe current state has not yet been checked.
AfterNo persistent state changed; the command printed evidence you can compare with the expected result.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure cli blob list --container-name enjyra-documents --output table
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure cli blob list --container-name enjyra-documents --output table
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure cli blob list --container-name enjyra-documents --output table
Run the command and compare its output with the Expected Result block.
If It Fails
- No such file or directory → verify the current folder and the path spelling.
- Permission denied → work inside your own lesson folder and confirm it is writable.
- Docker daemon not running → start Docker Desktop or Docker Engine, then retry.
What this command does Lists both blobs so you can compare the CLI output with the console's Blobs tab and blob count.
Challenge
Delete both blobs, then delete the container, then refresh the console and confirm the resource count returns to zero. The Reset lab button performs the same lesson-scoped cleanup safely: it removes containers, blobs, account-to-container mappings, version/recovery learning history, and any account contexts you created, then restores only the default enjyra context.
Ship
LOCAL_EMULATOR_PASS when Azurite is healthy, the container and blob appear in the console, the deliberate failure is clear, and cleanup is verified.
Next Step
Return to the bonus lab list. Each cloud lab is optional and independent of the 9 / 9 core completion.
Prepare Your Machine
Open only the setup step you need. Complete every verification before moving into Build.
This lesson needs
Install Docker Desktop / Engine (full walkthrough)
- Check your Mac's chip architecture (Apple Silicon vs Intel) before downloading.COMMAND
uname -mExpected output"arm64" (Apple Silicon) or "x86_64" (Intel)If error
If nothing prints, open Terminal from Applications → Utilities and try again.
- Download Docker Desktop for your chip from docs.docker.com/desktop/setup/install/mac-install and open the downloaded
.dmg, then drag Docker to Applications. - Launch Docker Desktop from Applications and wait for the whale icon in the menu bar to show "Docker Desktop is running".
- Verify the CLI is installed.COMMAND
docker --versionExpected outputDocker version 2x.x.x, build xxxxxxxIf error
If “command not found”, reopen Terminal after installing so your PATH refreshes, or reinstall Docker Desktop.
- Verify the engine is actually running (not just installed).COMMAND
docker infoExpected outputA block of server information, including Server Version and ContainersIf error
If it says “Cannot connect to the Docker daemon”, open Docker Desktop and wait for the whale icon to stop animating.
- Run a real test container end-to-end.COMMAND
docker run --rm hello-worldExpected output"Hello from Docker!" followed by an explanation of what happenedIf error
If the image can't be pulled, check your internet connection; this is the only step that needs it.
- Download Docker Desktop for Windows from docs.docker.com/desktop/setup/install/windows-install and run the installer. Docker Desktop will guide you through any compatible Windows backend requirement; this lesson does not require a WSL terminal.
- If the installer asks you to enable a Windows feature or restart, follow that prompt and finish the Docker Desktop setup before continuing.
- Start Docker Desktop from the Start menu and wait for the whale icon in the system tray to report "Docker Desktop is running".
- Verify the CLI, using PowerShell or the built-in VS Code terminal (not a Bash-syntax terminal).COMMAND
docker --versionExpected outputDocker version 2x.x.x, build xxxxxxxIf error
If “not recognized”, close and reopen your terminal so PATH changes take effect.
- Verify the engine is running.COMMAND
docker infoExpected outputA block of server information, including Server Version and ContainersIf error
If it can't connect to the daemon, open Docker Desktop, wait until it reports Running, and review Docker Desktop's own Troubleshoot panel.
- Run a real test container.COMMAND
docker run --rm hello-worldExpected output"Hello from Docker!" followed by an explanation of what happenedIf error
If the pull hangs, check your internet connection and that Docker Desktop shows as running, not starting.
- Prefer Docker Engine (not Docker Desktop) on Linux. Follow the official instructions for your distribution at docs.docker.com/engine/install — for Ubuntu specifically, use docs.docker.com/engine/install/ubuntu.
- Start and enable the Docker service.COMMAND
sudo systemctl enable --now dockerExpected outputNo output on successIf error
If systemctl isn't available, your distro may use a different init system — check its Docker Engine install page.
- Confirm the service is active.COMMAND
systemctl status dockerExpected outputActive: active (running)If error
If it shows “inactive” or “failed”, re-run the enable command above and check the install steps were completed.
- Verify the CLI.COMMAND
docker --versionExpected outputDocker version 2x.x.x, build xxxxxxxIf error
If “command not found”, the Engine install likely didn't finish — re-check the distro-specific install page.
- Verify the engine responds.COMMAND
docker infoExpected outputA block of server information, including Server Version and ContainersIf error
A permission-denied error here usually means your user isn't in the docker group yet — see the note below rather than running commands as root.
- Run a real test container.COMMAND
docker run --rm hello-worldExpected output"Hello from Docker!" followed by an explanation of what happenedIf error
If you see a permission error, add your user to the docker group yourself (sudo usermod -aG docker $USER, then log out and back in) — we won't do this for you automatically.
Note: running Docker commands as root or with a global chmod on the socket is not recommended. Add your user to the docker group instead, as shown above.
Before You Run
Install Docker Desktop on macOS or Windows, or Docker Engine/Desktop using the official instructions for your Linux distribution. Start Docker and open Terminal or native Windows PowerShell.
Why Do We Need Docker?
The ENJYRA AWS, Azure, and GCP labs run locally inside Docker containers. No real AWS, Azure, or GCP account is required.
Command Breakdown
docker --version- Confirms the Docker command-line client is installed.
docker info- Asks the Docker Engine for server information, proving it is running and reachable.
docker run --rm hello-world- Runs a small official test container end to end and removes it when finished.
Expected Result
Docker version 2x.x.x
docker info: server details
Hello from Docker!What Changed
BeforeDocker is not yet confirmed.
AfterDocker CLI and Docker Engine are available to launch the local lab.
Verify It
macOSdocker --version
docker info
Linuxdocker --version
docker info
Windows PowerShelldocker --version
docker info
If It Fails
- Open Docker Desktop or start Docker Engine, wait until it reports running, and retry.
- Open a new terminal after installation so PATH changes are loaded.
- On Linux, follow the official instructions for your distribution rather than assuming Ubuntu commands apply.
Install this once — later lessons that need Python will only ask you to verify it.
Official download: python.org/downloads
- Open python.org/downloads and download the current Python 3 installer for macOS, if Python 3 isn't already available.
- Run the installer, then open a new Terminal window (existing ones won't see the update).
- Verify.COMMAND
python3 --versionExpected outputPython 3.x.xIf error
If “command not found”, reopen Terminal, or check the installer actually completed.
- Open python.org/downloads and download Python 3 for Windows.
- Run the installer. When offered, enable "Add Python to PATH" — this step is easy to miss.
- Open a new PowerShell window and verify.COMMAND
py --versionExpected outputPython 3.x.xIf error
If py isn't found, try python --version instead — installers vary in which launcher they register.
- Many Linux distributions already include Python 3 — check first.COMMAND
python3 --versionExpected outputPython 3.x.xIf error
If not found, install Python 3 through your distribution's own package manager or documentation — this varies by distro, so there's no single command here.
- If it's missing, see python.org/downloads for the official source and platform-specific guidance.
Before You Run
Complete the installation instructions for your operating system, then open a new Terminal or native Windows PowerShell window.
Why You're Running This
Python is used by ENJYRA learning utilities, scripts, and exercises.
Command Breakdown
python3 --version / py --version- Asks the installed Python launcher to print its version without running a program.
Expected Result
Python 3.x.xWhat Changed
BeforePython 3 is not yet confirmed on this machine.
AfterA supported Python 3 launcher is available in Terminal or native Windows PowerShell.
Verify It
macOSpython3 --version
Linuxpython3 --version
Windows PowerShellpy --version (fallback: python --version)
If It Fails
Open a new terminal after installation. On Windows, confirm “Add Python to PATH” was selected, then try py or python.
Official download: git-scm.com/downloads
- Visit git-scm.com/downloads and follow the macOS installer, or check whether it's already installed.
- Verify.COMMAND
git --versionExpected outputgit version 2.x.xIf error
macOS may prompt to install Xcode Command Line Tools the first time you run git — accept that prompt, then try again.
- Download Git for Windows from git-scm.com/install/windows and run the installer, keeping the default options.
- Open a new PowerShell window and verify.COMMAND
git --versionExpected outputgit version 2.x.xIf error
Reopen PowerShell so it picks up the updated PATH.
- Git is often preinstalled; check first with the command below. If missing, see git-scm.com/downloads for your distribution's official install method — this is not the same command on every distro.
- Verify.COMMAND
git --versionExpected outputgit version 2.x.xIf error
If git is missing, install it using your distribution's official package manager instructions, then open a new terminal.
Before You Run
Complete the installation instructions for your operating system, then open a new Terminal or native Windows PowerShell window.
Why You're Running This
Git is needed to download the official ENJYRA Cloud Labs repository and work with version-controlled lesson files.
Command Breakdown
git --version- Asks Git to print its installed version without changing any files.
Expected Result
git version 2.x.xWhat Changed
BeforeGit is not yet confirmed on this machine.
AfterGit is available to clone https://github.com/gudshuis/enjyra-cloud-labs.
Verify It
macOSgit --version
Linuxgit --version
Windows PowerShellgit --version
If It Fails
Open a new terminal after installation so the updated PATH is loaded, then retry.
Official download: code.visualstudio.com/download
- Download from code.visualstudio.com/download, unzip, and drag VS Code to Applications.
- Open VS Code once to confirm it launches.
- Optional — verify the
codeshell command, if you want it (not required):COMMANDcode --versionExpected outputA version number, e.g. 1.9x.xIf error
The code command is often not installed by default. In VS Code, open the Command Palette and run “Shell Command: Install 'code' command in PATH” — or just confirm VS Code opens instead, below.
- Download from code.visualstudio.com/download and run the installer.
- Open VS Code once to confirm it launches.
- Optional — verify the
codeshell command:COMMANDcode --versionExpected outputA version number, e.g. 1.9x.xIf error
The Windows installer usually adds this automatically; if not, confirm VS Code opens instead, below.
- Download the package for your distribution from code.visualstudio.com/download and install it using your distribution's normal method.
- Open VS Code once to confirm it launches.
- Optional — verify the
codeshell command:COMMANDcode --versionExpected outputA version number, e.g. 1.9x.xIf error
The code command may not be linked automatically on Linux; confirming VS Code opens is enough for this lesson.
Before You Run
Complete the installation instructions for your operating system, then open a new Terminal or native Windows PowerShell window.
Why You're Running This
Visual Studio Code is used to inspect and edit learner files when a lesson requires it.
Command Breakdown
code --version (optional)- Checks the optional VS Code shell command. Readiness depends on the app opening, not on this command being installed.
Expected Result
VS Code opens successfully; code --version may also print a version number.What Changed
BeforeVisual Studio Code is not yet confirmed on this machine.
AfterVisual Studio Code opens and can be used for lesson files; the code command remains optional.
Verify It
macOSOpen Visual Studio Code
LinuxOpen Visual Studio Code
Windows PowerShellOpen Visual Studio Code
If It Fails
Launch VS Code from Applications or the Start menu. Do not block readiness only because code is missing from PATH.
Run each command in your own terminal. This page cannot run commands on your machine, so tick a box only after you see the expected result.
docker --versiondocker --versiondocker --versionBefore You Run
- Your terminal is open in Any terminal folder.
- Docker Desktop or Docker Engine is running.
Why You're Running This
Confirms the Docker command-line client is installed.
Command Breakdown
docker- Runs the docker tool with the shown arguments to complete this lesson step.
Expected Result
A Docker version is printedWhat Changed
BeforeThe action shown by this card has not yet been completed or verified.
AfterThe command has completed and the next lesson step has the state it needs.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Confirm Docker CLI is installed or running, then retry the command in a new terminal.
docker infodocker infodocker infoBefore You Run
- Your terminal is open in Any terminal folder.
- Docker Desktop or Docker Engine is running.
Why You're Running This
Confirms Docker is running before the local emulator starts.
Command Breakdown
docker- Runs the docker tool with the shown arguments to complete this lesson step.
Expected Result
Docker server information is returnedWhat Changed
BeforeThe action shown by this card has not yet been completed or verified.
AfterThe command has completed and the next lesson step has the state it needs.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Confirm Docker Engine is installed or running, then retry the command in a new terminal.
python3 --versionpython3 --versionpy --version
# If py is unavailable:
python --versionBefore You Run
- Your terminal is open in Any terminal folder.
- Python 3 is installed; activate .venv first when the lesson has already created it.
Why You're Running This
Confirms Python 3 is installed. Windows PowerShell uses py --version, with python --version as a fallback.
Command Breakdown
python- Runs the selected Python module or script with the supplied arguments.
py- Runs the py tool with the shown arguments to complete this lesson step.
#- Runs the # tool with the shown arguments to complete this lesson step.
Expected Result
A supported Python 3.x version is printedWhat Changed
BeforeThe saved program has not yet been executed for this verification step.
AfterThe program ran and produced output or started the local process described by the lesson.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Confirm Python is installed or running, then retry the command in a new terminal.
git --versiongit --versiongit --versionBefore You Run
- Your terminal is open in Any terminal folder.
- Git is installed; cloning also requires an internet connection.
Why You're Running This
Confirms Git is available to download the public ENJYRA Cloud Labs repository.
Command Breakdown
git- Runs the git tool with the shown arguments to complete this lesson step.
Expected Result
A Git version is printedWhat Changed
BeforeThe action shown by this card has not yet been completed or verified.
AfterThe command has completed and the next lesson step has the state it needs.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Confirm Git is installed or running, then retry the command in a new terminal.
Download the official public ENJYRA Cloud Labs repository. It contains the launchers, Compose files, and verification scripts used by B01, B02, and B03. Students do not manually create these files.
Already downloaded it? Reuse the same folder, open a terminal inside it, and continue to verification.
git clone https://github.com/gudshuis/enjyra-cloud-labs.git
cd enjyra-cloud-labsgit clone https://github.com/gudshuis/enjyra-cloud-labs.git
cd enjyra-cloud-labsgit clone https://github.com/gudshuis/enjyra-cloud-labs.git
Set-Location enjyra-cloud-labsBefore You Run
- Your terminal is open in the current lesson workspace.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
- Git is installed; cloning also requires an internet connection.
Why You're Running This
Downloads the official ENJYRA Cloud Labs repository and moves your terminal into its folder.
Command Breakdown
git clone- Downloads a complete working copy of the official public ENJYRA Cloud Labs repository.
https://github.com/gudshuis/enjyra-cloud-labs.git- Identifies the official public repository to download.
cd / Set-Location- Moves macOS/Linux Terminal or native Windows PowerShell into the downloaded lab folder.
Expected Result
enjyra-cloud-labs/
├── scripts/
├── compose/
├── verify/
└── VERSIONWhat Changed
BeforeThe repository folder is not present in this workspace.
AfterA local repository folder exists and the terminal has moved into it when the command includes cd / Set-Location.
Verify It
macOSgit -C enjyra-cloud-labs status --short
Linuxgit -C enjyra-cloud-labs status --short
Windows PowerShellgit -C enjyra-cloud-labs status --short
No output means the downloaded working tree is clean.
If It Fails
- If Git is not installed, complete the Git setup above. If cloning reports a network error, confirm your internet connection and retry.
What this command does Downloads the official ENJYRA Cloud Labs repository and moves your terminal into its folder.
enjyra-cloud-labs/
├── scripts/
├── compose/
├── verify/
└── VERSIONIf it fails
If Git is not installed, complete the Git setup above. If cloning reports a network error, confirm your internet connection and retry.
Run the verifier for your operating system before starting a local cloud lab. It checks required files, checksums and integrity, Docker, Docker Compose, Git, Python, and launcher availability.
./verify/verify-enjyra-lab-macos.sh./verify/verify-enjyra-lab-linux.sh.\verify\verify-enjyra-lab.ps1Before You Run
- Your terminal is open in enjyra-cloud-labs.
Why You're Running This
Reads the downloaded files and local tool state without starting AWS, Azure, or GCP.
Command Breakdown
./verify/verify-enjyra-lab-macos.sh- Runs the macOS integrity and prerequisite verifier from the repository.
./verify/verify-enjyra-lab-linux.sh- Runs the Linux integrity and prerequisite verifier from the repository.
.\verify\verify-enjyra-lab.ps1- Runs the native Windows PowerShell verifier; WSL is not required.
Expected Result
PASS: All files match checksums.txt
Integrity: VERIFIEDWhat Changed
BeforeThe action shown by this card has not yet been completed or verified.
AfterThe command has completed and the next lesson step has the state it needs.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Do not start the lab after a checksum failure. Replace only the incomplete enjyra-cloud-labs folder with a fresh clone, then run the verifier again. If Docker fails, start Docker Desktop or Docker Engine first.
What this command does Reads the downloaded files and local tool state without starting AWS, Azure, or GCP.
PASS: All files match checksums.txt
Integrity: VERIFIEDIf it fails
Do not start the lab after a checksum failure. Replace only the incomplete enjyra-cloud-labs folder with a fresh clone, then run the verifier again. If Docker fails, start Docker Desktop or Docker Engine first.
- Docker CLI verified
- Docker Engine running
- Python verified
- Git verified
- VS Code ready
- ENJYRA Cloud Labs downloaded
- ENJYRA Cloud Labs integrity verified
Need help with a prerequisite?
Docker is not running? Open Docker Desktop or start Docker Engine, then run docker info again.
The repository will not clone? Confirm Git is installed and your internet connection can reach github.com, then retry.
Integrity verification failed? Do not start the lab. Remove only the incomplete enjyra-cloud-labs folder, clone the official repository again, and rerun the verifier.
A lab port is already in use? Stop the process using the lesson port; do not prune unrelated Docker resources.
The console stays on STARTING? Run the lesson status command, then inspect only this lab with the lesson logs command.
Launch the ENJYRA Lab
Start only after the prerequisite checks above are complete.
One start command runs the lesson-scoped emulator and localhost console. The browser detects when it is ready.
ENJYRA Lab · b02-blob-v6.0.0
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure start./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure start.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure startBefore You Run
- Your terminal is open in ~/enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Starts this lesson’s emulator and ENJYRA localhost console as a lesson-scoped Docker Compose project.
Command Breakdown
ENJYRA launcher · AZURE · start- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its start action.
Expected Result
The emulator and ENJYRA console report healthy.What Changed
BeforeThe requested local service or lab containers are not yet confirmed running.
AfterThe local service or lab containers are running in the background and can be verified.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
Both the emulator and ENJYRA console should report healthy.
If It Fails
- Check the current folder, confirm Docker is running when required, and verify the image or script name before retrying.
What this command does Starts this lesson’s emulator and ENJYRA localhost console as a lesson-scoped Docker Compose project.
The emulator and ENJYRA console report healthy.If it fails
Check the current folder, confirm Docker is running when required, and verify the image or script name before retrying.
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure statusBefore You Run
- Your terminal is open in ~/enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Checks that both the local emulator and ENJYRA console are healthy before you use the browser interface.
Command Breakdown
ENJYRA launcher · AZURE · status- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its status action.
Expected Result
The lab reports READY and its services are healthy.What Changed
BeforeThe current state has not yet been checked.
AfterNo persistent state changed; the command printed evidence you can compare with the expected result.
Verify It
macOS./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure status
Linux./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure status
Windows PowerShell.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure status
Run the command and compare its output with the Expected Result block.
If It Fails
- Confirm the start command completed first, then compare the image, container, port, or script name exactly with this lesson.
What this command does Checks that both the local emulator and ENJYRA console are healthy before you use the browser interface.
The lab reports READY and its services are healthy.If it fails
Confirm the start command completed first, then compare the image, container, port, or script name exactly with this lesson.
Reset My Lab
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure reset./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure reset.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure resetBefore You Run
- Your terminal is open in ~/enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Returns this lesson’s local runtime or resources to a known starting state without touching unrelated projects.
Command Breakdown
ENJYRA launcher · AZURE · reset- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its reset action.
Expected Result
This lesson’s runtime state is reset or the named lesson container is removed.What Changed
BeforeThe lesson service or local lab may still be running.
AfterThe requested lesson service has been stopped or its lesson-scoped state reset.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Check Docker is running and make sure you are using this lesson’s exact container or launcher name.
What this command does Returns this lesson’s local runtime or resources to a known starting state without touching unrelated projects.
This lesson’s runtime state is reset or the named lesson container is removed.If it fails
Check Docker is running and make sure you are using this lesson’s exact container or launcher name.
Clean up the lab
./scripts/cloud-labs/enjyra-cloud-lab-macos.sh azure stop./scripts/cloud-labs/enjyra-cloud-lab-linux.sh azure stop.\scripts\cloud-labs\enjyra-cloud-lab.ps1 azure stopBefore You Run
- Your terminal is open in ~/enjyra-cloud-labs.
- Docker Desktop or Docker Engine is running.
- You have cloned enjyra-cloud-labs and are working inside that repository.
Why You're Running This
Stops or removes only this lesson’s local runtime so it does not keep using machine resources.
Command Breakdown
ENJYRA launcher · AZURE · stop- Uses the operating-system-specific ENJYRA launcher, selects the AZURE local lab, and performs its stop action.
Expected Result
The lesson-scoped service or container is no longer running.What Changed
BeforeThe lesson service or local lab may still be running.
AfterThe requested lesson service has been stopped or its lesson-scoped state reset.
Verify It
macOSInspect the command output shown above.
LinuxInspect the command output shown above.
Windows PowerShellInspect the command output shown above.
Continue only when the observed result matches the Expected Result block.
If It Fails
- Inspect this lesson’s status first, then retry with the exact launcher or container name shown here.
What this command does Stops or removes only this lesson’s local runtime so it does not keep using machine resources.
The lesson-scoped service or container is no longer running.If it fails
Inspect this lesson’s status first, then retry with the exact launcher or container name shown here.
Prove What You Learned
This lesson contains 4 focused questions. You answered 2 before the build; complete the remaining 2 now.