mirror of
https://github.com/dockur/windows.git
synced 2026-02-03 17:27:21 +00:00
Merge 31b7153275 into 588969ae5f
This commit is contained in:
commit
43132b144b
30
.env.example
Normal file
30
.env.example
Normal file
@ -0,0 +1,30 @@
|
||||
# Windows Docker VM Configuration
|
||||
#
|
||||
# Two env files are provided with optimized defaults:
|
||||
# - .env.modern (8G RAM, 4 CPU) - Windows 10/11, Server 2016+
|
||||
# - .env.legacy (2G RAM, 2 CPU) - Windows 7/8, Vista, XP, 2000, Server 2003-2012, Tiny
|
||||
#
|
||||
# Each compose file references the appropriate env file automatically.
|
||||
# Edit .env.modern or .env.legacy to customize settings.
|
||||
#
|
||||
# Available settings:
|
||||
#
|
||||
# RAM_SIZE=8G # Memory allocation
|
||||
# CPU_CORES=4 # CPU cores
|
||||
# DISK_SIZE=128G # Virtual disk size
|
||||
# USERNAME=Docker # Windows username
|
||||
# PASSWORD=admin # Windows password
|
||||
# LANGUAGE=en # Installation language
|
||||
# REGION=en-US # Region setting
|
||||
# KEYBOARD=en-US # Keyboard layout
|
||||
# WIDTH=1280 # Display width
|
||||
# HEIGHT=720 # Display height
|
||||
# DHCP=N # Use DHCP (Y/N)
|
||||
# SAMBA=Y # Enable file sharing (Y/N)
|
||||
# RESTART_POLICY=on-failure # Restart policy (no, on-failure, always, unless-stopped)
|
||||
# DEBUG=N # Debug mode (Y/N)
|
||||
# WINDOWS_IMAGE=dockurr/windows # Docker image (dockurr/windows-arm for ARM64)
|
||||
#
|
||||
# winctl.sh settings (place in .env file):
|
||||
#
|
||||
# AUTO_CACHE=N # Auto-cache ISOs on stop (Y/N)
|
||||
32
.env.legacy
Normal file
32
.env.legacy
Normal file
@ -0,0 +1,32 @@
|
||||
# Legacy Systems Configuration (Windows 7/8, Vista, XP, 2000, Server 2003-2012, Tiny)
|
||||
|
||||
# Resources
|
||||
RAM_SIZE=2G
|
||||
CPU_CORES=2
|
||||
DISK_SIZE=32G
|
||||
|
||||
# User Credentials
|
||||
USERNAME=docker
|
||||
PASSWORD=admin
|
||||
|
||||
# Language & Region
|
||||
LANGUAGE=en
|
||||
REGION=en-US
|
||||
KEYBOARD=en-US
|
||||
|
||||
# Display
|
||||
WIDTH=1280
|
||||
HEIGHT=720
|
||||
|
||||
# Network
|
||||
DHCP=N
|
||||
SAMBA=Y
|
||||
|
||||
# Restart Policy (no, on-failure, always, unless-stopped)
|
||||
RESTART_POLICY=on-failure
|
||||
|
||||
# Docker Image (dockurr/windows for x86, dockurr/windows-arm for ARM64)
|
||||
WINDOWS_IMAGE=dockurr/windows
|
||||
|
||||
# Debug
|
||||
DEBUG=N
|
||||
32
.env.modern
Normal file
32
.env.modern
Normal file
@ -0,0 +1,32 @@
|
||||
# Modern Systems Configuration (Windows 10/11, Server 2016+)
|
||||
|
||||
# Resources
|
||||
RAM_SIZE=8G
|
||||
CPU_CORES=4
|
||||
DISK_SIZE=128G
|
||||
|
||||
# User Credentials
|
||||
USERNAME=docker
|
||||
PASSWORD=admin
|
||||
|
||||
# Language & Region
|
||||
LANGUAGE=en
|
||||
REGION=en-US
|
||||
KEYBOARD=en-US
|
||||
|
||||
# Display
|
||||
WIDTH=1280
|
||||
HEIGHT=720
|
||||
|
||||
# Network
|
||||
DHCP=N
|
||||
SAMBA=Y
|
||||
|
||||
# Restart Policy (no, on-failure, always, unless-stopped)
|
||||
RESTART_POLICY=on-failure
|
||||
|
||||
# Docker Image (dockurr/windows for x86, dockurr/windows-arm for ARM64)
|
||||
WINDOWS_IMAGE=dockurr/windows
|
||||
|
||||
# Debug
|
||||
DEBUG=N
|
||||
6
.github/workflows/review.yml
vendored
6
.github/workflows/review.yml
vendored
@ -22,6 +22,7 @@ jobs:
|
||||
with:
|
||||
locale: "US"
|
||||
level: warning
|
||||
fail_level: error
|
||||
pattern: |
|
||||
*.md
|
||||
*.sh
|
||||
@ -32,6 +33,7 @@ jobs:
|
||||
uses: reviewdog/action-hadolint@v1
|
||||
with:
|
||||
level: warning
|
||||
fail_level: error
|
||||
reporter: github-pr-review
|
||||
hadolint_ignore: DL3006 DL3008
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@ -40,6 +42,7 @@ jobs:
|
||||
uses: reviewdog/action-yamllint@v1
|
||||
with:
|
||||
level: warning
|
||||
fail_level: error
|
||||
reporter: github-pr-review
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
-
|
||||
@ -47,6 +50,7 @@ jobs:
|
||||
uses: reviewdog/action-actionlint@v1
|
||||
with:
|
||||
level: warning
|
||||
fail_level: error
|
||||
reporter: github-pr-review
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
-
|
||||
@ -54,6 +58,7 @@ jobs:
|
||||
uses: reviewdog/action-shfmt@v1
|
||||
with:
|
||||
level: warning
|
||||
fail_level: error
|
||||
shfmt_flags: "-i 2 -ci -bn"
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
-
|
||||
@ -61,6 +66,7 @@ jobs:
|
||||
uses: reviewdog/action-shellcheck@v1
|
||||
with:
|
||||
level: warning
|
||||
fail_level: error
|
||||
reporter: github-pr-review
|
||||
shellcheck_flags: -x -e SC1091 -e SC2001 -e SC2002 -e SC2034 -e SC2064 -e SC2153 -e SC2317 -e SC2028
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
17
.gitignore
vendored
17
.gitignore
vendored
@ -1 +1,18 @@
|
||||
# Environment file (contains local settings)
|
||||
.env
|
||||
|
||||
# Ignore data folder contents but keep structure
|
||||
data/*
|
||||
!data/*/
|
||||
data/*/**
|
||||
!data/*/.gitkeep
|
||||
|
||||
# Snapshot contents (generated at runtime)
|
||||
snapshots/*
|
||||
!snapshots/.gitkeep
|
||||
|
||||
# Instance compose files and registry (generated at runtime)
|
||||
instances/
|
||||
|
||||
# ISO cache (cached ISOs for faster instance creation)
|
||||
cache/
|
||||
|
||||
62
CHANGELOG.md
Normal file
62
CHANGELOG.md
Normal file
@ -0,0 +1,62 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [1.0.0] - 2026-01-30
|
||||
|
||||
### Added
|
||||
- **winctl.sh**: Management script for Windows Docker containers
|
||||
- 20+ commands: start, stop, restart, status, logs, shell, stats, build, rebuild, list, inspect, monitor, check, refresh, open, pull, disk, snapshot, restore, clean, destroy, instances, cache, help
|
||||
- Interactive menus for version selection
|
||||
- Prerequisites checking (Docker, Compose, KVM, TUN, memory, disk)
|
||||
- Color-coded output with professional table formatting
|
||||
- Safety confirmations for destructive operations
|
||||
- Support for all 22 Windows versions across 4 categories
|
||||
- JSON status cache (`~/.cache/winctl/status.json`) with auto-refresh
|
||||
- **Multi-instance support**: run multiple instances of the same version
|
||||
- `start <version> --new` creates auto-numbered instances with allocated ports
|
||||
- `start <version> --new <name>` creates named instances
|
||||
- `--clone` copies data from the base version
|
||||
- JSON registry (`instances/registry.json`) tracks all instances
|
||||
- `instances` lists all registered instances; `destroy` removes them
|
||||
- **ISO cache**: skip re-downloading ISOs for new instances
|
||||
- `cache download <version>` downloads original ISOs using the container's download logic
|
||||
- `cache save <version>` caches from data directory (skips rebuilt ISOs)
|
||||
- Auto-restore on `start --new` copies cached ISOs before container starts
|
||||
- `cache list` / `cache rm` / `cache flush` for cache management
|
||||
- Rebuilt ISOs (genisoimage output) detected and skipped automatically
|
||||
- **Auto-cache on stop**: `AUTO_CACHE=Y` in `.env` caches unprocessed ISOs when stopping
|
||||
- **Snapshot & restore**: back up and restore VM data directories
|
||||
- **Topic-based help system**: `help [commands|instances|cache|examples|config|all]`
|
||||
- Interactive numbered menu in terminal mode
|
||||
- Auto-disabled in pipes, CI, and batch environments
|
||||
- Aligned columns using `_help_row()` with ANSI-safe formatting
|
||||
- **ARM64 auto-detection**: blocks unsupported versions, shows `[x86 only]` tags
|
||||
- **LAN IP detection** with remote access URLs shown on start
|
||||
- **Port conflict detection** before starting containers
|
||||
- **Disk usage monitoring** with per-VM and snapshot breakdowns
|
||||
- Multi-version compose structure with organized folders (`compose/`)
|
||||
- Environment file configuration (`.env` / `.env.example`)
|
||||
- Two resource profiles: modern (8G RAM, 4 CPU) and legacy (2G RAM, 2 CPU)
|
||||
- Per-version data folders under `data/`
|
||||
- Pre-configured compose files for all Windows versions:
|
||||
- Desktop: Win 11, 10, 8.1, 7 (with Enterprise variants)
|
||||
- Legacy: Vista, XP, 2000
|
||||
- Server: 2003, 2008, 2012, 2016, 2019, 2022, 2025
|
||||
- Tiny: Tiny11, Tiny10
|
||||
- Unique port mappings for each version (no conflicts)
|
||||
- CLAUDE.md for Claude Code guidance
|
||||
- WINCTL_GUIDE.md comprehensive user guide
|
||||
|
||||
### Changed
|
||||
- Default storage location changed from `./windows` to `./data/`
|
||||
- Compose files now use `env_file` for centralized configuration
|
||||
- Restart policy changed from `always` to `on-failure`
|
||||
- `clean --data` now unregisters instances and removes compose files
|
||||
|
||||
### Resource Profiles
|
||||
|
||||
| Profile | RAM | CPU | Disk | Used By |
|
||||
|---------|-----|-----|------|---------|
|
||||
| Modern | 8G | 4 | 128G | Win 10/11, Server 2016+ |
|
||||
| Legacy | 2G | 2 | 32G | Win 7/8, Vista, XP, 2000, Server 2003-2012, Tiny |
|
||||
149
CLAUDE.md
Normal file
149
CLAUDE.md
Normal file
@ -0,0 +1,149 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
This is **dockur/windows** - a Docker container that runs Windows inside QEMU with KVM acceleration. It provides automatic Windows installation with ISO downloading, VirtIO driver injection, and unattended setup via answer files.
|
||||
|
||||
## Architecture
|
||||
|
||||
### Entry Point & Script Chain
|
||||
|
||||
The container starts via `/run/entry.sh` which sources scripts in sequence:
|
||||
1. `start.sh` → `utils.sh` → `reset.sh` → `server.sh` → `define.sh` → `mido.sh` → `install.sh`
|
||||
2. Then: `disk.sh` → `display.sh` → `network.sh` → `samba.sh` → `boot.sh` → `proc.sh` → `power.sh` → `memory.sh` → `config.sh` → `finish.sh`
|
||||
3. Finally launches `qemu-system-x86_64` with constructed arguments
|
||||
|
||||
### Key Components
|
||||
|
||||
- **src/define.sh**: Version parsing, language mapping, and Windows edition detection. Maps user-friendly version strings (e.g., "11", "10l", "2022") to internal identifiers
|
||||
- **src/mido.sh**: Microsoft ISO downloader - scrapes Microsoft's download portal to get direct ISO links
|
||||
- **src/install.sh**: ISO extraction, image detection, driver injection, answer file customization, and ISO rebuilding using `wimlib-imagex` and `genisoimage`
|
||||
- **src/samba.sh**: Configures Samba for host-guest file sharing (appears as "Shared" folder on desktop)
|
||||
- **assets/*.xml**: Unattended answer files for different Windows versions
|
||||
|
||||
### Build System
|
||||
|
||||
- Base image: `qemux/qemu` (QEMU with web-based VNC viewer)
|
||||
- VirtIO drivers downloaded at build time from `qemus/virtiso-whql`
|
||||
- Multi-arch support: amd64 native, arm64 via `dockur/windows-arm`
|
||||
|
||||
### GitHub Codespaces
|
||||
|
||||
The `.devcontainer/` directory provides GitHub Codespaces configurations — separate from the `compose/` files used by `winctl.sh`.
|
||||
|
||||
- `devcontainer.json` (root): Default config, launches Windows 11 Pro
|
||||
- Numbered subfolders (010–210): Alternative configs for each Windows version
|
||||
- `codespaces.yml`: Shared compose file using `ghcr.io/dockur/windows`
|
||||
- Runs a single VM at a time on ports 8006/3389 (no unique port mapping needed)
|
||||
- Do not sync ports with `compose/` files — they serve different use cases
|
||||
|
||||
## Commands
|
||||
|
||||
### Linting & Validation
|
||||
|
||||
```bash
|
||||
# ShellCheck for all shell scripts
|
||||
shellcheck -x --source-path=src src/*.sh
|
||||
|
||||
# Dockerfile linting
|
||||
hadolint Dockerfile
|
||||
|
||||
# XML validation (answer files)
|
||||
# Uses action-pack/valid-xml in CI
|
||||
```
|
||||
|
||||
### Building
|
||||
|
||||
```bash
|
||||
# Build Docker image locally
|
||||
docker build -t windows .
|
||||
|
||||
# Build with version argument
|
||||
docker build --build-arg VERSION_ARG=1.0 -t windows .
|
||||
```
|
||||
|
||||
### Testing Locally
|
||||
|
||||
```bash
|
||||
# Run container (requires KVM)
|
||||
docker run -it --rm -e "VERSION=11" -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD}/storage:/storage" windows
|
||||
|
||||
# Access web viewer at http://localhost:8006
|
||||
```
|
||||
|
||||
## CI/CD
|
||||
|
||||
- **check.yml**: Runs on PRs - ShellCheck, Hadolint, XML/JSON/YAML validation
|
||||
- **build.yml**: Manual trigger - builds multi-arch image, pushes to Docker Hub and GHCR
|
||||
- **test.yml**: Runs check.yml on PRs
|
||||
|
||||
ShellCheck exclusions (from CI): SC1091, SC2001, SC2002, SC2034, SC2064, SC2153, SC2317, SC2028
|
||||
|
||||
## Key Environment Variables
|
||||
|
||||
| Variable | Default | Description |
|
||||
|----------|---------|-------------|
|
||||
| VERSION | "11" | Windows version (11, 10, 10l, 2022, etc.) or ISO URL |
|
||||
| LANGUAGE | "en" | Installation language |
|
||||
| USERNAME | "Docker" | Windows username |
|
||||
| PASSWORD | "admin" | Windows password |
|
||||
| DISK_SIZE | "64G" | Virtual disk size |
|
||||
| RAM_SIZE | "4G" | RAM allocation |
|
||||
| CPU_CORES | "2" | CPU cores |
|
||||
| MANUAL | "" | Set to "Y" for manual installation |
|
||||
|
||||
## Git Remotes & Pull Requests
|
||||
|
||||
### Remotes
|
||||
|
||||
| Remote | Repository | Purpose |
|
||||
|--------|-----------|---------|
|
||||
| `origin` | `michelabboud/windows` | Personal repo, push directly to `master` |
|
||||
| `fork` | `michelabboud/windows-1` | Fork of `dockur/windows`, used for PRs to upstream |
|
||||
|
||||
### Creating a PR to upstream
|
||||
|
||||
1. Push changes to a feature branch on the fork:
|
||||
```bash
|
||||
git push fork master:<branch-name>
|
||||
```
|
||||
2. Create the PR:
|
||||
```bash
|
||||
gh pr create --repo dockur/windows --head michelabboud:<branch-name> --base master --title "..." --body "..."
|
||||
```
|
||||
3. Create a matching issue:
|
||||
```bash
|
||||
gh issue create --repo dockur/windows --title "..." --body "..."
|
||||
```
|
||||
|
||||
### Updating an existing PR
|
||||
|
||||
Push new commits to the same branch on the fork:
|
||||
```bash
|
||||
git push fork master:<branch-name>
|
||||
```
|
||||
The PR updates automatically. Update the PR description if needed:
|
||||
```bash
|
||||
gh pr edit <pr-number> --repo dockur/windows --body "..."
|
||||
```
|
||||
|
||||
### Updating the GitHub release
|
||||
|
||||
```bash
|
||||
gh release edit <tag> --notes "..."
|
||||
```
|
||||
|
||||
### Active PRs
|
||||
|
||||
| PR | Branch | Issue | Description |
|
||||
|----|--------|-------|-------------|
|
||||
| [#1637](https://github.com/dockur/windows/pull/1637) | `feat/winctl-management-script` | [#1639](https://github.com/dockur/windows/issues/1639) | winctl.sh management script with ARM64 support |
|
||||
| [#1638](https://github.com/dockur/windows/pull/1638) | `fix/reviewdog-fail-level` | [#1640](https://github.com/dockur/windows/issues/1640) | Replace deprecated fail_on_error with fail_level in reviewdog actions |
|
||||
|
||||
## Adding New Windows Versions
|
||||
|
||||
1. Add version aliases in `src/define.sh` `parseVersion()` function
|
||||
2. Create answer file in `assets/` named `{version}.xml`
|
||||
3. Add driver folder mapping in `src/install.sh` `addDriver()` function
|
||||
1272
WINCTL_GUIDE.md
Normal file
1272
WINCTL_GUIDE.md
Normal file
File diff suppressed because it is too large
Load Diff
12
compose.yml
12
compose.yml
@ -1,9 +1,17 @@
|
||||
# Default compose file - Windows 11 Pro
|
||||
# For more versions, see compose/ folder
|
||||
# Configure settings in .env file
|
||||
|
||||
services:
|
||||
windows:
|
||||
image: dockurr/windows
|
||||
container_name: windows
|
||||
env_file: .env
|
||||
environment:
|
||||
VERSION: "11"
|
||||
RAM_SIZE: ${MODERN_RAM_SIZE:-8G}
|
||||
CPU_CORES: ${MODERN_CPU_CORES:-4}
|
||||
DISK_SIZE: ${MODERN_DISK_SIZE:-128G}
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
@ -14,6 +22,6 @@ services:
|
||||
- 3389:3389/tcp
|
||||
- 3389:3389/udp
|
||||
volumes:
|
||||
- ./windows:/storage
|
||||
restart: always
|
||||
- ./data/win11:/storage
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 2m
|
||||
|
||||
6
compose/all.yml
Normal file
6
compose/all.yml
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
include:
|
||||
- desktop.yml
|
||||
- legacy.yml
|
||||
- server.yml
|
||||
- tiny.yml
|
||||
6
compose/desktop.yml
Normal file
6
compose/desktop.yml
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
include:
|
||||
- desktop/win11.yml
|
||||
- desktop/win10.yml
|
||||
- desktop/win8.yml
|
||||
- desktop/win7.yml
|
||||
61
compose/desktop/win10.yml
Normal file
61
compose/desktop/win10.yml
Normal file
@ -0,0 +1,61 @@
|
||||
---
|
||||
services:
|
||||
win10:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win10
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "10"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8010:8006
|
||||
- 3310:3389/tcp
|
||||
- 3310:3389/udp
|
||||
volumes:
|
||||
- ../../data/win10:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
|
||||
win10e:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win10e
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "10e"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8014:8006
|
||||
- 3314:3389/tcp
|
||||
- 3314:3389/udp
|
||||
volumes:
|
||||
- ../../data/win10e:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
|
||||
win10l:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win10l
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "10l"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8015:8006
|
||||
- 3315:3389/tcp
|
||||
- 3315:3389/udp
|
||||
volumes:
|
||||
- ../../data/win10l:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
61
compose/desktop/win11.yml
Normal file
61
compose/desktop/win11.yml
Normal file
@ -0,0 +1,61 @@
|
||||
---
|
||||
services:
|
||||
win11:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win11
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "11"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8011:8006
|
||||
- 3311:3389/tcp
|
||||
- 3311:3389/udp
|
||||
volumes:
|
||||
- ../../data/win11:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
|
||||
win11e:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win11e
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "11e"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8012:8006
|
||||
- 3312:3389/tcp
|
||||
- 3312:3389/udp
|
||||
volumes:
|
||||
- ../../data/win11e:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
|
||||
win11l:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win11l
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "11l"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8013:8006
|
||||
- 3313:3389/tcp
|
||||
- 3313:3389/udp
|
||||
volumes:
|
||||
- ../../data/win11l:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
41
compose/desktop/win7.yml
Normal file
41
compose/desktop/win7.yml
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
services:
|
||||
win7:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win7
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "7u"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8007:8006
|
||||
- 3307:3389/tcp
|
||||
- 3307:3389/udp
|
||||
volumes:
|
||||
- ../../data/win7:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
|
||||
win7e:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win7e
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "7e"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8071:8006
|
||||
- 3371:3389/tcp
|
||||
- 3371:3389/udp
|
||||
volumes:
|
||||
- ../../data/win7e:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
41
compose/desktop/win8.yml
Normal file
41
compose/desktop/win8.yml
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
services:
|
||||
win81:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win81
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "8"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8008:8006
|
||||
- 3308:3389/tcp
|
||||
- 3308:3389/udp
|
||||
volumes:
|
||||
- ../../data/win81:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
|
||||
win81e:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win81e
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "8e"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8081:8006
|
||||
- 3381:3389/tcp
|
||||
- 3381:3389/udp
|
||||
volumes:
|
||||
- ../../data/win81e:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
5
compose/legacy.yml
Normal file
5
compose/legacy.yml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
include:
|
||||
- legacy/vista.yml
|
||||
- legacy/winxp.yml
|
||||
- legacy/win2k.yml
|
||||
21
compose/legacy/vista.yml
Normal file
21
compose/legacy/vista.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
vista:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: vista
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "vu"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8006:8006
|
||||
- 3306:3389/tcp
|
||||
- 3306:3389/udp
|
||||
volumes:
|
||||
- ../../data/vista:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
21
compose/legacy/win2k.yml
Normal file
21
compose/legacy/win2k.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
win2k:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win2k
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "2k"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8000:8006
|
||||
- 3300:3389/tcp
|
||||
- 3300:3389/udp
|
||||
volumes:
|
||||
- ../../data/win2k:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
21
compose/legacy/winxp.yml
Normal file
21
compose/legacy/winxp.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
winxp:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: winxp
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "xp"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8005:8006
|
||||
- 3305:3389/tcp
|
||||
- 3305:3389/udp
|
||||
volumes:
|
||||
- ../../data/winxp:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
9
compose/server.yml
Normal file
9
compose/server.yml
Normal file
@ -0,0 +1,9 @@
|
||||
---
|
||||
include:
|
||||
- server/win2025.yml
|
||||
- server/win2022.yml
|
||||
- server/win2019.yml
|
||||
- server/win2016.yml
|
||||
- server/win2012.yml
|
||||
- server/win2008.yml
|
||||
- server/win2003.yml
|
||||
21
compose/server/win2003.yml
Normal file
21
compose/server/win2003.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
win2003:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win2003
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "2003"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8003:8006
|
||||
- 3303:3389/tcp
|
||||
- 3303:3389/udp
|
||||
volumes:
|
||||
- ../../data/win2003:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
21
compose/server/win2008.yml
Normal file
21
compose/server/win2008.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
win2008:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win2008
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "2008"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8108:8006
|
||||
- 3208:3389/tcp
|
||||
- 3208:3389/udp
|
||||
volumes:
|
||||
- ../../data/win2008:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
21
compose/server/win2012.yml
Normal file
21
compose/server/win2012.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
win2012:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win2012
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "2012"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8112:8006
|
||||
- 3212:3389/tcp
|
||||
- 3212:3389/udp
|
||||
volumes:
|
||||
- ../../data/win2012:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
21
compose/server/win2016.yml
Normal file
21
compose/server/win2016.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
win2016:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win2016
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "2016"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8016:8006
|
||||
- 3316:3389/tcp
|
||||
- 3316:3389/udp
|
||||
volumes:
|
||||
- ../../data/win2016:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
21
compose/server/win2019.yml
Normal file
21
compose/server/win2019.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
win2019:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win2019
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "2019"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8019:8006
|
||||
- 3319:3389/tcp
|
||||
- 3319:3389/udp
|
||||
volumes:
|
||||
- ../../data/win2019:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
21
compose/server/win2022.yml
Normal file
21
compose/server/win2022.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
win2022:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win2022
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "2022"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8022:8006
|
||||
- 3322:3389/tcp
|
||||
- 3322:3389/udp
|
||||
volumes:
|
||||
- ../../data/win2022:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
21
compose/server/win2025.yml
Normal file
21
compose/server/win2025.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
win2025:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: win2025
|
||||
env_file: ../../.env.modern
|
||||
environment:
|
||||
VERSION: "2025"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8025:8006
|
||||
- 3325:3389/tcp
|
||||
- 3325:3389/udp
|
||||
volumes:
|
||||
- ../../data/win2025:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
4
compose/tiny.yml
Normal file
4
compose/tiny.yml
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
include:
|
||||
- tiny/tiny11.yml
|
||||
- tiny/tiny10.yml
|
||||
21
compose/tiny/tiny10.yml
Normal file
21
compose/tiny/tiny10.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
tiny10:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: tiny10
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "tiny10"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8110:8006
|
||||
- 3110:3389/tcp
|
||||
- 3110:3389/udp
|
||||
volumes:
|
||||
- ../../data/tiny10:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
21
compose/tiny/tiny11.yml
Normal file
21
compose/tiny/tiny11.yml
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
services:
|
||||
tiny11:
|
||||
image: ${WINDOWS_IMAGE:-dockurr/windows}
|
||||
container_name: tiny11
|
||||
env_file: ../../.env.legacy
|
||||
environment:
|
||||
VERSION: "tiny11"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
ports:
|
||||
- 8111:8006
|
||||
- 3111:3389/tcp
|
||||
- 3111:3389/udp
|
||||
volumes:
|
||||
- ../../data/tiny11:/storage
|
||||
restart: ${RESTART_POLICY:-on-failure}
|
||||
stop_grace_period: 2m
|
||||
0
data/tiny10/.gitkeep
Normal file
0
data/tiny10/.gitkeep
Normal file
0
data/tiny11/.gitkeep
Normal file
0
data/tiny11/.gitkeep
Normal file
0
data/vista/.gitkeep
Normal file
0
data/vista/.gitkeep
Normal file
0
data/win10/.gitkeep
Normal file
0
data/win10/.gitkeep
Normal file
0
data/win10e/.gitkeep
Normal file
0
data/win10e/.gitkeep
Normal file
0
data/win10l/.gitkeep
Normal file
0
data/win10l/.gitkeep
Normal file
0
data/win11/.gitkeep
Normal file
0
data/win11/.gitkeep
Normal file
0
data/win11e/.gitkeep
Normal file
0
data/win11e/.gitkeep
Normal file
0
data/win11l/.gitkeep
Normal file
0
data/win11l/.gitkeep
Normal file
0
data/win2003/.gitkeep
Normal file
0
data/win2003/.gitkeep
Normal file
0
data/win2008/.gitkeep
Normal file
0
data/win2008/.gitkeep
Normal file
0
data/win2012/.gitkeep
Normal file
0
data/win2012/.gitkeep
Normal file
0
data/win2016/.gitkeep
Normal file
0
data/win2016/.gitkeep
Normal file
0
data/win2019/.gitkeep
Normal file
0
data/win2019/.gitkeep
Normal file
0
data/win2022/.gitkeep
Normal file
0
data/win2022/.gitkeep
Normal file
0
data/win2025/.gitkeep
Normal file
0
data/win2025/.gitkeep
Normal file
0
data/win2k/.gitkeep
Normal file
0
data/win2k/.gitkeep
Normal file
0
data/win7/.gitkeep
Normal file
0
data/win7/.gitkeep
Normal file
0
data/win7e/.gitkeep
Normal file
0
data/win7e/.gitkeep
Normal file
0
data/win81/.gitkeep
Normal file
0
data/win81/.gitkeep
Normal file
0
data/win81e/.gitkeep
Normal file
0
data/win81e/.gitkeep
Normal file
0
data/winxp/.gitkeep
Normal file
0
data/winxp/.gitkeep
Normal file
171
readme.md
171
readme.md
@ -70,6 +70,153 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
|
||||
|
||||
[](https://winboat.app)
|
||||
|
||||
## Multi-Version Setup 🗂️
|
||||
|
||||
This repository includes pre-configured compose files for all Windows versions with optimized resource profiles.
|
||||
|
||||
### Management Script (winctl.sh)
|
||||
|
||||
Use `winctl.sh` for easy container management:
|
||||
|
||||
```bash
|
||||
# Check prerequisites and detected architecture
|
||||
./winctl.sh check
|
||||
|
||||
# Start a container (interactive menu if no version specified)
|
||||
./winctl.sh start win11
|
||||
./winctl.sh start # Shows interactive menu
|
||||
|
||||
# View status of all containers
|
||||
./winctl.sh status
|
||||
|
||||
# Stop containers (with confirmation)
|
||||
./winctl.sh stop win11
|
||||
./winctl.sh stop all # Stop all running
|
||||
|
||||
# View logs
|
||||
./winctl.sh logs win11 -f
|
||||
|
||||
# List all available versions (shows [x86 only] on ARM64)
|
||||
./winctl.sh list
|
||||
./winctl.sh list desktop # Filter by category
|
||||
|
||||
# Real-time monitoring dashboard
|
||||
./winctl.sh monitor
|
||||
|
||||
# Rebuild container (preserves data)
|
||||
./winctl.sh rebuild win11
|
||||
|
||||
# Open web viewer in browser
|
||||
./winctl.sh open win11
|
||||
|
||||
# Pull latest Docker image
|
||||
./winctl.sh pull
|
||||
|
||||
# Show disk usage per VM
|
||||
./winctl.sh disk
|
||||
|
||||
# Snapshot and restore VM data
|
||||
./winctl.sh snapshot win11 before-update
|
||||
./winctl.sh restore win11 before-update
|
||||
|
||||
# Clean up stopped containers
|
||||
./winctl.sh clean
|
||||
|
||||
# Multi-instance support
|
||||
./winctl.sh start winxp --new # Create winxp-1 with auto ports
|
||||
./winctl.sh start winxp --new lab # Create winxp-lab
|
||||
./winctl.sh start winxp --new lab --clone # Clone data from base
|
||||
./winctl.sh instances # List all instances
|
||||
./winctl.sh destroy winxp-lab # Remove instance
|
||||
|
||||
# ISO cache (skip re-downloads for new instances)
|
||||
./winctl.sh cache download winxp # Download original ISO to cache
|
||||
./winctl.sh cache list # Show cached ISOs
|
||||
./winctl.sh start winxp --new # New instance uses cached ISO
|
||||
./winctl.sh cache rm winxp # Remove cached winxp ISO
|
||||
./winctl.sh cache flush # Clear all cached ISOs
|
||||
|
||||
# Full help (includes ARM64 info)
|
||||
./winctl.sh help
|
||||
```
|
||||
|
||||
### Quick Start (Manual)
|
||||
|
||||
```bash
|
||||
# Run specific version
|
||||
docker compose -f compose/desktop/win11.yml up win11
|
||||
docker compose -f compose/legacy/winxp.yml up winxp
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
Two pre-configured env files with optimized defaults:
|
||||
|
||||
| File | RAM | CPU | Disk | Used By |
|
||||
|------|-----|-----|------|---------|
|
||||
| `.env.modern` | 8G | 4 | 128G | Win 10/11, Server 2016+ |
|
||||
| `.env.legacy` | 2G | 2 | 32G | Win 7/8, Vista, XP, 2000, Server 2003-2012, Tiny |
|
||||
|
||||
Edit these files to customize:
|
||||
|
||||
```bash
|
||||
# .env.modern or .env.legacy
|
||||
RAM_SIZE=8G
|
||||
CPU_CORES=4
|
||||
DISK_SIZE=128G
|
||||
USERNAME=docker
|
||||
PASSWORD=admin
|
||||
LANGUAGE=en
|
||||
RESTART_POLICY=on-failure # Options: no, on-failure, always, unless-stopped
|
||||
```
|
||||
|
||||
> 📖 See [WINCTL_GUIDE.md](WINCTL_GUIDE.md) for complete documentation, usage scenarios, and troubleshooting.
|
||||
|
||||
### Folder Structure
|
||||
|
||||
```
|
||||
.env.modern # Modern system defaults (8G RAM)
|
||||
.env.legacy # Legacy system defaults (2G RAM)
|
||||
compose/
|
||||
├── desktop/ # Win 11, 10, 8.1, 7
|
||||
├── legacy/ # Vista, XP, 2000
|
||||
├── server/ # Server 2003-2025
|
||||
└── tiny/ # Tiny10, Tiny11
|
||||
|
||||
instances/ # Generated instance files
|
||||
├── registry.json # Instance registry
|
||||
└── *.yml # Instance compose files
|
||||
|
||||
data/ # VM storage (per-version folders)
|
||||
├── win11/
|
||||
├── winxp/
|
||||
├── winxp-1/ # Instance data
|
||||
└── ...
|
||||
|
||||
snapshots/ # VM data snapshots
|
||||
├── win11/
|
||||
└── ...
|
||||
|
||||
cache/ # ISO cache (skip re-downloads)
|
||||
├── winxp/
|
||||
└── ...
|
||||
```
|
||||
|
||||
### Port Reference
|
||||
|
||||
| Version | Web UI | RDP |
|
||||
|---------|--------|-----|
|
||||
| win11 | 8011 | 3311 |
|
||||
| win10 | 8010 | 3310 |
|
||||
| win81 | 8008 | 3308 |
|
||||
| win7 | 8007 | 3307 |
|
||||
| vista | 8006 | 3306 |
|
||||
| winxp | 8005 | 3305 |
|
||||
| win2k | 8000 | 3300 |
|
||||
| win2025 | 8025 | 3325 |
|
||||
| win2022 | 8022 | 3322 |
|
||||
| tiny11 | 8111 | 3111 |
|
||||
|
||||
## FAQ 💬
|
||||
|
||||
### How do I use it?
|
||||
@ -122,6 +269,30 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
|
||||
> [!TIP]
|
||||
> To install ARM64 versions of Windows use [dockur/windows-arm](https://github.com/dockur/windows-arm/).
|
||||
|
||||
### How do I run on ARM64?
|
||||
|
||||
The `winctl.sh` script auto-detects your CPU architecture. On ARM64 systems (e.g., Apple Silicon, Ampere), only Windows 10 and 11 variants are supported:
|
||||
|
||||
| **Value** | **Version** |
|
||||
|---|---|
|
||||
| `11` | Windows 11 Pro |
|
||||
| `11l` | Windows 11 LTSC |
|
||||
| `11e` | Windows 11 Enterprise |
|
||||
| `10` | Windows 10 Pro |
|
||||
| `10l` | Windows 10 LTSC |
|
||||
| `10e` | Windows 10 Enterprise |
|
||||
|
||||
To configure, set the ARM64 image in your `.env.modern` or `.env.legacy` file:
|
||||
|
||||
```bash
|
||||
WINDOWS_IMAGE=dockurr/windows-arm
|
||||
```
|
||||
|
||||
The script will automatically:
|
||||
- Block unsupported versions with a clear error on `start`
|
||||
- Show `[x86 only]` tags next to unsupported versions on `list`
|
||||
- Display your detected architecture on `check`
|
||||
|
||||
### How do I change the storage location?
|
||||
|
||||
To change the storage location, include the following bind mount in your compose file:
|
||||
|
||||
0
snapshots/.gitkeep
Normal file
0
snapshots/.gitkeep
Normal file
Loading…
Reference in New Issue
Block a user