Skip to content

feat: Multi-version management script (winctl.sh) with ARM64 support #1639

@michelabboud

Description

@michelabboud

Description

Running multiple Windows versions simultaneously requires manually managing individual compose files, ports, and resources. There's no unified tool to start, stop, monitor, or list all available Windows versions.

Proposal

A management script (winctl.sh) that provides:

  • 20+ commands for container lifecycle (start/stop/restart/status/logs/shell/stats/build/rebuild/list/inspect/monitor/check/refresh/open/pull/disk/snapshot/restore/clean/destroy/instances/cache/help)
  • 22 Windows versions organized by category (desktop, legacy, server, tiny)
  • Interactive menus when no version is specified
  • Pre-configured compose files with unique port mappings per version
  • Resource profiles: .env.modern (8G RAM, 4 CPU) and .env.legacy (2G RAM, 2 CPU)
  • JSON status caching for fast repeated queries
  • ARM64 auto-detection: blocks unsupported versions on ARM, shows [x86 only] tags, configurable WINDOWS_IMAGE variable for dockurr/windows-arm
  • Multi-instance support: run multiple instances of the same version with auto-allocated ports and JSON registry
  • ISO cache: download and cache original ISOs to skip re-downloads on new instances (cache download, auto-restore on --new)
  • Snapshot & restore: back up and restore VM data directories
  • Topic-based help: help [commands|instances|cache|examples|config|all] with interactive numbered menu
  • Auto-cache on stop: AUTO_CACHE=Y in .env to automatically cache ISOs when stopping containers
  • LAN IP detection with remote access URLs shown automatically
  • Port conflict detection before starting containers
  • Disk usage monitoring with per-VM and snapshot breakdowns

ARM64 Details

Only Win 10/11 variants are supported on ARM64 (win11, win11e, win11l, win10, win10e, win10l). The script detects the architecture via uname -m and:

  • Blocks start for unsupported versions with a clear error
  • Tags unsupported versions in list output
  • Shows architecture info in check and help
  • Compose files use ${WINDOWS_IMAGE:-dockurr/windows} so ARM64 users set WINDOWS_IMAGE=dockurr/windows-arm

ISO Cache Details

The cache stores original (unprocessed) ISOs. When creating a new instance, the cached ISO is copied to the data directory. The container processes it locally (extract, inject drivers, answer file) without re-downloading.

  • cache download <version> — downloads original ISO using the container's download logic
  • cache save <version> — caches from data directory (skips rebuilt ISOs automatically)
  • Auto-restore on start --new — copies cached ISO before container starts
  • Rebuilt ISOs (genisoimage output) are detected and skipped because they contain a duplicate boot catalog entry that 7z cannot re-extract

PR

#1637

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions