Container & Virtualization Inventory
Beyond installed software and services, the Hermes agent also inventories the workloads a machine hosts: Docker and Podman containers on Linux endpoints, and Hyper-V and VMware Workstation virtual machines on Windows endpoints. This gives you a fleet-wide picture of container runtimes, images, volumes, and registered VMs without logging in to each host.
This inventory is read-only discovery. Athena reports what is installed and registered on each host; it does not start, stop, or modify containers or virtual machines.
Platform coverage#
The two areas are collected by different platform agents and appear as separate sections in the agent detail view:
| Inventory | Runtimes | Collected on |
|---|---|---|
| Containers | Docker, Podman (rootful and rootless) | Linux endpoints |
| Virtualization | Hyper-V, VMware Workstation | Windows endpoints |
Each section is shown only when it applies. On the agent detail view, the Containers and Virtualization entries appear under the Configuration group — the Virtualization section is surfaced only when a hypervisor is detected on the host. A machine that runs no containers and no hypervisor simply reports nothing for these areas.
Container inventory (Linux)#
On Linux endpoints, Hermes detects the Docker and Podman runtimes independently and, when a runtime is reachable, enumerates its containers, images, and volumes.
Runtime detection
For each runtime, the agent reports:
| Field | Meaning |
|---|---|
RuntimeName | Docker or Podman. |
IsInstalled | The runtime binary is present on the host. |
IsAccessible | The agent could query the runtime (socket reachable / permissions sufficient). |
ServiceRunning | The runtime's service/socket is active. |
Version | Runtime version (e.g. 24.0.7). |
BuildInfo | Build / commit identifier. |
RootlessUsers | Users with rootless Podman sessions (Podman only). |
ErrorMessage | Set when the runtime is installed but could not be queried — for example, installed but the daemon is not running, or installed but inaccessible due to permissions. |
Detection is deliberately honest: an installed-but-unreachable runtime is reported as
IsInstalled = true with an explanatory ErrorMessage rather than being
silently dropped, so you can tell "no Docker here" apart from "Docker is here but the agent
can't see it."
Rootless Podman
Podman is commonly run rootless, per user. In addition to the system (rootful) instance, Hermes discovers users with an active rootless Podman session and enumerates each user's containers, images, and volumes as well. Rootless items are labelled with the owning user so they are easy to distinguish in the list. If the rootful instance is not reachable but rootless sessions are found, the runtime is still reported as accessible so those workloads are not lost.
What's reported per container, image, and volume
| Object | Fields |
|---|---|
| Container | Id, Name, Image, Command, CreatedAt, State (running / exited / paused), Status (e.g. "Up 2 hours"), Ports (e.g. 0.0.0.0:8080->80/tcp). |
| Image | Id, Repository, Tag, CreatedAt, Size, and a dangling flag for untagged images. |
| Volume | Name, Driver, Mountpoint, Scope. |
Requirements. Container discovery relies on the Docker or Podman CLI being
present and the runtime being reachable by the agent's service account. For system-wide Docker
this typically means the daemon is running and its socket is accessible; for rootless Podman,
the target users must have an active session. Stopped daemons or permission errors are
reported as an ErrorMessage rather than an empty result.
Virtualization inventory (Windows)#
On Windows endpoints, Hermes detects locally installed hypervisors and enumerates all registered VMs regardless of power state — running and powered-off alike.
Hyper-V
Both the Hyper-V client optional feature and the Windows Server Hyper-V role are detected (they share the same management tooling). When present, Hermes reports the management module version and enumerates every VM with these fields:
| Field | Meaning |
|---|---|
Name | VM display name. |
PowerState | Native state (Running / Off / Saved / Paused), preserved verbatim. |
PowerStateNormalized | Normalized state used for consistent display across hypervisors. |
VcpuCount | Assigned virtual CPU count. |
MemoryAssignedBytes | Assigned memory. |
IpAddresses | Guest IP address(es) reported by the VM's integration services. Left empty (not fabricated) when the guest reports none — e.g. integration services are off or absent. |
If Hyper-V is installed but the VMs cannot be enumerated — usually a permissions issue — the host is still reported as having Hyper-V installed, together with an actionable status message explaining that the agent should be run with sufficient privileges (for example, by adding its service account to the Hyper-V Administrators group). VMs are never silently omitted.
VMware Workstation
VMware Workstation is detected via its registry install path / known install locations. Hermes then builds a complete list of VMs by combining:
- Running VMs — identified from the running virtual-machine processes on the host.
- All registered VMs — read from every user profile's VMware inventory, so powered-off machines are included too.
Each VM reports its name, power state (normalized to Running / Off), configuration path, and — where readable from the VM configuration — its assigned vCPU count and memory. If Workstation is installed but no VMs are readable, the host is reported as installed with a status message instead of an empty list.
Where to see it#
Open a machine from the Agents list and use the agent detail view's left-hand navigation:
- Configuration → Containers — the container runtimes found on the host, with their containers, images, and volumes (Linux hosts).
- Configuration → Virtualization — the hypervisors found on the host and their registered VMs (Windows hosts). This entry appears only when a hypervisor is detected.
Like the rest of inventory, these results are refreshed on the agent's regular status cadence, so the view reflects the last successful collection rather than a live query at open time.
Reading it over the API#
Container and virtualization data are part of an agent's full inventory. Fetch the complete
inventory document and read the containerInventory and
virtualizationInventory sections (each is null when it does not apply
to that host):
# Fetch the full inventory for one agent, then inspect containers / VMs
$headers = @{ Authorization = "Bearer $token" }
$inv = Invoke-RestMethod `
-Uri "https://athena.example.com:8443/api/agents/$agentId/inventory" `
-Headers $headers `
-SkipCertificateCheck
$inv.data.containerInventory.docker.containers
$inv.data.virtualizationInventory.hyperV.vms
Reading inventory requires the Helpdesk role or higher. For the full inventory surface, sub-routes, and refresh behaviour, see Inventory. For the PowerShell module used to script against the server, see the PowerShell Module reference.