Compare commits

...

17 Commits
v3.00 ... v3.05

Author SHA1 Message Date
Kroese
eb0b0fe80c feat: Improved installation (#486) 2024-05-12 13:49:56 +02:00
Kroese
47d2d2294c feat: Faster ESD extraction (#484) 2024-05-10 21:26:10 +02:00
Kroese
f7986f57ce feat: Improved installation (#483) 2024-05-10 18:21:41 +02:00
Kroese
5a000c1f9e feat: Store installation type (#477) 2024-05-09 15:59:06 +02:00
Kroese
3b7e2373f7 feat: Store installation type (#476) 2024-05-09 15:47:46 +02:00
Kroese
8bbd87df40 feat: Refactor platform code (#472) 2024-05-09 11:19:34 +02:00
Kroese
fd1fd1c48f fix: Disable Mido debug output (#470) 2024-05-08 23:25:15 +02:00
Kroese
f99032312c feat: Detect architecture in ISO (#463) 2024-05-07 02:11:59 +02:00
Kroese
b56db85787 docs: Update issues template (#461) 2024-05-05 22:41:38 +02:00
Kroese
5ff0e3dae5 Update QUESTION.yml (#460) 2024-05-05 22:37:43 +02:00
Kroese
4b23877eaa feat: Improved installation (#459) 2024-05-05 21:24:47 +02:00
Kroese
0cb936d64d Update install.sh (#455) 2024-05-04 19:12:58 +02:00
Kroese
22a5bd72d3 feat: Show download percentage (#454) 2024-05-04 18:29:05 +02:00
Kroese
0616eb3447 feat: Improved installation (#453) 2024-05-04 13:28:12 +02:00
Kroese
63c6fc0808 fix: Revert PR (#445) 2024-05-02 01:09:28 +02:00
lly-c232733
7e6a5d1b1d PR: Add ability to override image detection (#442) 2024-05-01 20:42:37 +02:00
Kroese
cafb187d26 docs: Readme (#440) 2024-04-30 23:32:03 +02:00
11 changed files with 1556 additions and 774 deletions

View File

@@ -3,10 +3,20 @@ description: General questions about the container
title: "[Question]: "
labels: ["question"]
body:
- type: markdown
- type: checkboxes
attributes:
value: |
Please do not use this form for technical issues, and make sure to check the [FAQ](https://github.com/dockur/windows/blob/master/readme.md) first!
label: Is your question not already answered in the FAQ?
description: Please read the [FAQ](https://github.com/dockur/windows/blob/master/readme.md) carefully to avoid asking duplicate questions.
options:
- label: I made sure the question is not listed in the [FAQ](https://github.com/dockur/windows/blob/master/readme.md).
required: true
- type: checkboxes
attributes:
label: Is this a general question and not a technical issue?
description: For technical issues you must use the [bug report](https://github.com/dockur/windows/issues/new?assignees=&labels=bug&projects=&template=BUG_REPORT.yml&title=%5BBug%5D%3A+) form instead. It contains all the right fields (system info, logfiles, etc.) we need in order to be able to help you.
options:
- label: I am sure my question is not about a technical issue.
required: true
- type: textarea
id: question
attributes:

View File

@@ -21,5 +21,5 @@ jobs:
uses: hadolint/hadolint-action@v3.1.0
with:
dockerfile: Dockerfile
ignore: DL3008,DL4006,SC3037
ignore: DL3008
failure-threshold: warning

View File

@@ -1,5 +1,5 @@
FROM scratch
COPY --from=qemux/qemu-docker:4.27 / /
COPY --from=qemux/qemu-docker:5.03 / /
ARG DEBCONF_NOWARNINGS "yes"
ARG DEBIAN_FRONTEND "noninteractive"
@@ -12,14 +12,11 @@ RUN apt-get update && \
7zip \
wsdd \
samba \
wimtools \
dos2unix \
cabextract \
genisoimage \
libxml2-utils && \
echo "deb http://deb.debian.org/debian/ sid main" >> /etc/apt/sources.list.d/sid.list && \
echo -e "Package: *\nPin: release n=trixie\nPin-Priority: 900\nPackage: *\nPin: release n=sid\nPin-Priority: 400" | tee /etc/apt/preferences.d/preferences > /dev/null && \
apt-get update && \
apt-get -t sid --no-install-recommends -y install wimtools && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

View File

@@ -52,8 +52,8 @@
<OSImage>
<InstallFrom>
<MetaData wcm:action="add">
<Value>1</Value>
<Key>/IMAGE/INDEX</Key>
<Value>Windows 7 PROFESSIONAL</Value>
<Key>/IMAGE/NAME</Key>
</MetaData>
</InstallFrom>
<InstallTo>
@@ -76,7 +76,7 @@
<FullName>Docker</FullName>
<Organization>Windows for Docker</Organization>
<ProductKey>
<Key>H7X92-3VPBB-Q799D-Y6JJ3-86WC6</Key>
<Key>HYF8J-CVRMY-CM74G-RPHKF-PW487</Key>
<WillShowUI>OnError</WillShowUI>
</ProductKey>
</UserData>

View File

@@ -51,7 +51,7 @@
<OSImage>
<InstallFrom>
<MetaData wcm:action="add">
<Value>Windows Vista Ultimate</Value>
<Value>Windows Vista BUSINESS</Value>
<Key>/IMAGE/NAME</Key>
</MetaData>
</InstallFrom>
@@ -68,7 +68,7 @@
<FullName>Docker</FullName>
<Organization>Windows for Docker</Organization>
<ProductKey>
<Key>VMCB9-FDRV6-6CDQM-RV23K-RP8F7</Key>
<Key>4D2XH-PRBMM-8Q22B-K8BM3-MRW4W</Key>
</ProductKey>
</UserData>
</component>
@@ -100,7 +100,7 @@
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<ComputerName>*</ComputerName>
<ProductKey>VMCB9-FDRV6-6CDQM-RV23K-RP8F7</ProductKey>
<ProductKey>4D2XH-PRBMM-8Q22B-K8BM3-MRW4W</ProductKey>
<TimeZone>Pacific Standard Time</TimeZone>
<OEMInformation>
<Manufacturer>Dockur</Manufacturer>

197
readme.md
View File

@@ -78,62 +78,31 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
Select from the values below:
| **Value** | **Version** | **Edition** | **Size** |
|---|---|---|---|
| `win11` | Windows 11 | Pro | 6.4 GB |
| `win11e` | Windows 11 | Enterprise | 5.8 GB |
| `win10` | Windows 10 | Pro | 5.8 GB |
| `ltsc10` | Windows 10 | LTSC | 4.6 GB |
| `win10e` | Windows 10 | Enterprise | 5.2 GB |
| `win81` | Windows 8.1 | Pro | 4.2 GB |
| `win81e` | Windows 8.1 | Enterprise | 3.8 GB |
| `win7` | Windows 7 | Enterprise | 3.0 GB |
| `vista` | Windows Vista | Ultimate | 3.6 GB |
| `winxp` | Windows XP | Pro | 0.6 GB |
|||||
| `2022` | Windows Server 2022 | Standard | 4.7 GB |
| `2019` | Windows Server 2019 | Standard | 5.3 GB |
| `2016` | Windows Server 2016 | Standard | 6.5 GB |
| `2012` | Windows Server 2012 | Standard | 4.3 GB |
| `2008` | Windows Server 2008 | Standard | 3.0 GB |
|||||
| `core11` | Tiny 11 | Core | 2.1 GB |
| `tiny11` | Tiny 11 | 2311 | 3.8 GB |
| `tiny10` | Tiny 10 | 23H2 | 3.6 GB |
| **Value** | **Version** | **Size** |
|---|---|---|
| `win11` | Windows 11 Pro | 6.4 GB |
| `win11e` | Windows 11 Enterprise | 5.8 GB |
| `win10` | Windows 10 Pro | 5.8 GB |
| `ltsc10` | Windows 10 LTSC | 4.6 GB |
| `win10e` | Windows 10 Enterprise | 5.2 GB |
| `win81` | Windows 8.1 Pro | 4.2 GB |
| `win81e` | Windows 8.1 Enterprise | 3.8 GB |
| `win7` | Windows 7 Enterprise | 3.0 GB |
| `vista` | Windows Vista Enterprise | 3.0 GB |
| `winxp` | Windows XP Professional | 0.6 GB |
||||
| `2022` | Windows Server 2022 | 4.7 GB |
| `2019` | Windows Server 2019 | 5.3 GB |
| `2016` | Windows Server 2016 | 6.5 GB |
| `2012` | Windows Server 2012 | 4.3 GB |
| `2008` | Windows Server 2008 | 3.0 GB |
||||
| `core11` | Tiny 11 Core | 2.1 GB |
| `tiny11` | Tiny 11 | 3.8 GB |
| `tiny10` | Tiny 10 | 3.6 GB |
To install ARM64 versions of Windows use [dockur/windows-arm](https://github.com/dockur/windows-arm/).
* ### How do I connect using RDP?
The web-viewer is mainly meant to be used during installation, as its picture quality is low, and it has no audio or clipboard for example.
So for a better experience you can connect using any Microsoft Remote Desktop client to the IP of the container, using the username `docker` and by leaving the password empty.
There is a good RDP client for [Android](https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx) available from the Play Store and one for [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB) in the Apple Store. For Linux you can use [FreeRDP](https://www.freerdp.com/) and on Windows just type `mstsc` in the search box.
* ### How do I increase the amount of CPU or RAM?
By default, 2 CPU cores and 4 GB of RAM are allocated to the container, as those are the minimum requirements of Windows 11.
To increase this, add the following environment variables:
```yaml
environment:
RAM_SIZE: "8G"
CPU_CORES: "4"
```
* ### How do I change the size of the disk?
To expand the default size of 64 GB, add the `DISK_SIZE` setting to your compose file and set it to your preferred capacity:
```yaml
environment:
DISK_SIZE: "256G"
```
This can also be used to resize the existing disk to a larger capacity without any data loss.
* ### How do I change the storage location?
To change the storage location, include the following bind mount in your compose file:
@@ -145,40 +114,58 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
Replace the example path `/var/win` with the desired storage folder.
* ### How do I change the size of the disk?
To expand the default size of 64 GB, add the `DISK_SIZE` setting to your compose file and set it to your preferred capacity:
```yaml
environment:
DISK_SIZE: "256G"
```
This can also be used to resize the existing disk to a larger capacity without any data loss.
* ### How do I share files with the host?
Open File Explorer and click on the Network section, you will see a computer called `host.lan`, double-click it and it will show a folder called `Data`.
Open 'File Explorer' and click on the 'Network' section, you will see a computer called `host.lan`. Double-click it and it will show a folder called `Data`, which can be binded to any folder on your host via the compose file:
Inside this folder you can access any files that are placed in `/storage/shared` (see above) on the host.
```yaml
volumes:
- /home/user/example:/shared
```
The example folder `/home/user/example` will be available as ` \\host.lan\Data`. You can optionally map this path to a drive letter in Windows, for easier access.
* ### How do I install a custom image?
In order to download a custom ISO image, start a fresh container with the URL of the ISO specified in the `VERSION` environment variable:
In order to download an unsupported ISO image that is not selectable from the list above, specify the URL of that ISO in the `VERSION` environment variable, for example:
```yaml
environment:
VERSION: "https://example.com/win.iso"
```
Alternatively, you can also use a local file directly, and skip the download, by binding it in your compose file in this way:
Alternatively, you can also skip the download and use a local file instead, by binding it in your compose file in this way:
```yaml
volumes:
- /home/user/example.iso:/storage/custom.iso
- /home/user/example.iso:/custom.iso
```
Replace the example path `/home/user/example.iso` with the filename of the desired ISO file. The value of `VERSION` will be ignored in this case.
Replace the example path `/home/user/example.iso` with the filename of your desired ISO file, the value of `VERSION` will be ignored in this case.
* ### How do I customize the installation?
You can customize every setting used by the automatic installation. Download the XML file corresponding to your Windows version, for example [win11x64.xml](https://raw.githubusercontent.com/dockur/windows/master/assets/win11x64.xml). Then apply your modifications to it, and add this line to your compose file:
If you want to modify the settings used during the automatic installation, you can do this by editing the answer file corresponding to your Windows edition, for example [win11x64.xml](https://raw.githubusercontent.com/dockur/windows/master/assets/win11x64.xml) in the case of Windows 11 Pro.
Apply your modifications to it, and add this line to your compose file:
```yaml
volumes:
- /home/user/custom.xml:/run/assets/win11x64.xml
- /home/user/example.xml:/custom.xml
```
Replace the example path `/home/user/custom.xml` with the filename of the modified XML file.
Replace the example path `/home/user/example.xml` with the filename of the modified XML file.
* ### How do I run a script after installation?
@@ -186,16 +173,16 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
```yaml
volumes:
- /home/user/example:/storage/oem
- /home/user/example:/oem
```
The example path `/home/user/example` will be copied to `C:\OEM` during installation and the containing `install.bat` will be executed.
The example folder `/home/user/example` will be copied to `C:\OEM` during installation and the containing `install.bat` will be executed during the last step.
* ### How do I perform a manual installation?
It's best to use the automatic installation, as it optimizes various settings for use with this container. These tweaks will give you maximum performance and prevent common issues.
It's best to use the automatic installation, as it optimizes various settings to give you maximum performance and prevent common issues.
However, if you insist on performing the installation manually, start a fresh container with the following environment variable:
However, if you insist on performing the installation manually, add the following environment variable to your compose file:
```yaml
environment:
@@ -206,19 +193,58 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
- Start the container and connect to [port 8006](http://localhost:8006) of the container in your web browser. After the download is finished, you will see the Windows installation screen.
- Start the installation by clicking `Install now`. On the next screen, press 'OK' when prompted to `Load driver` and select the `VirtIO SCSI` driver from the list that matches your Windows version. So for Windows 11, select `D:\amd64\w11\vioscsi.inf` and click 'Next'.
- Start the installation by clicking `Install now`. On the next screen, press 'OK' when prompted to `Load driver`.
- Select the `VirtIO SCSI` driver from the list that matches your Windows version. So for Windows 11, select `D:\amd64\w11\vioscsi.inf` and click 'Next'.
- Accept the license agreement and select your preferred Windows edition, like Home or Pro.
- Choose `Custom: Install Windows only (advanced)`, and click `Load driver` on the next screen. Select 'Browse' and navigate to the `D:\NetKVM\w11\amd64` folder, and click 'OK'. Select the `VirtIO Ethernet Adapter` from the list and click 'Next'.
- Choose `Custom: Install Windows only (advanced)`, and click `Load driver` on the next screen.
- Select 'Browse' and navigate to the `D:\NetKVM\w11\amd64` folder, and click 'OK'.
- Select the `VirtIO Ethernet Adapter` from the list and click 'Next'.
- Select `Drive 0` and click 'Next'.
- Wait until Windows finishes copying files and completes the installation.
- Once you see the desktop, open File Explorer and navigate to the CD-ROM drive (E:). Double-click on `virtio-win-gt-x64.msi` and proceed to install the VirtIO drivers.
- Once you see the desktop, open File Explorer and navigate to the CD-ROM drive (`E:\`).
- Double-click on `virtio-win-gt-x64.msi` and proceed to install the VirtIO drivers.
Enjoy your brand new machine, and don't forget to star this repo!
* ### How do I verify if my system supports KVM?
To verify if your system supports KVM, run the following commands:
```bash
sudo apt install cpu-checker
sudo kvm-ok
```
If you receive an error from `kvm-ok` indicating that KVM acceleration can't be used, check the virtualization settings in the BIOS.
* ### How do I increase the amount of CPU or RAM?
By default, 2 CPU cores and 4 GB of RAM are allocated to the container, as those are the minimum requirements of Windows 11.
If there arises a need to increase this, add the following environment variables:
```yaml
environment:
RAM_SIZE: "8G"
CPU_CORES: "4"
```
* ### How do I connect using RDP?
The web-viewer is mainly meant to be used during installation, as its picture quality is low, and it has no audio or clipboard for example.
So for a better experience you can connect using any Microsoft Remote Desktop client to the IP of the container, using the username `docker` and by leaving the password empty.
There is a good RDP client for [Android](https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx) available from the Play Store and one for [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB) in the Apple Store. For Linux you can use [FreeRDP](https://www.freerdp.com/) and on Windows just type `mstsc` in the search box.
* ### How do I assign an individual IP address to the container?
@@ -272,21 +298,31 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
```
Please note that in this mode, the container and Windows will each have their own separate IPs. The container will keep the macvlan IP, and Windows will use the DHCP IP.
* ### How do I add multiple disks?
To create additional disks, modify your compose file like this:
```yaml
environment:
DISK2_SIZE: "32G"
DISK3_SIZE: "64G"
volumes:
- /home/example:/storage2
- /mnt/data/example:/storage3
```
* ### How do I pass-through a disk?
It is possible to pass-through disk devices directly by adding them to your compose file in this way:
```yaml
environment:
DEVICE: "/dev/sda"
DEVICE2: "/dev/sdb"
devices:
- /dev/sda
- /dev/sdb
- /dev/sdb:/disk1
- /dev/sdc:/disk2
```
Use `DEVICE` if you want it to become your main drive, and use `DEVICE2` and higher to add them as secondary drives.
Use `/disk1` if you want it to become your main drive, and use `/disk2` and higher to add them as secondary drives.
* ### How do I pass-through a USB device?
@@ -298,17 +334,6 @@ docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_
devices:
- /dev/bus/usb
```
* ### How do I verify if my system supports KVM?
To verify if your system supports KVM, run the following commands:
```bash
sudo apt install cpu-checker
sudo kvm-ok
```
If you receive an error from `kvm-ok` indicating that KVM acceleration can't be used, check the virtualization settings in the BIOS.
* ### Is this project legal?

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,8 +3,6 @@
# Copyright (C) 2024 Elliot Killick <contact@elliotkillick.com>
# Licensed under the MIT License. See LICENSE file for details.
[ "$DEBUG" ] && set -x
# Prefer Dash shell for greater security if available
if [ "$BASH" ] && command -v dash > /dev/null; then
exec dash "$0" "$@"
@@ -388,7 +386,7 @@ consumer_download() {
# Filter for 64-bit ISO download URL
# sed: HTML decode "&" character
# tr: Filter for only alphanumerics or punctuation
iso_download_link="$(echo "$iso_download_link_html" | grep -o "https://software.download.prss.microsoft.com.*IsoX64" | cut -d '"' -f 1 | sed 's/&amp;/\&/g' | tr -cd '[:alnum:][:punct:]' | head -c 512)"
iso_download_link="$(echo "$iso_download_link_html" | grep -o "https://software.download.prss.microsoft.com.*IsoX64" | cut -d '"' -f 1 | sed 's/&amp;/\&/g' | tr -cd '[:alnum:][:punct:]')"
if ! [ "$iso_download_link" ]; then
# This should only happen if there's been some change to the download endpoint web address

View File

@@ -28,9 +28,11 @@ boot() {
[ -f "$QEMU_END" ] && return 0
if [ -s "$QEMU_PTY" ]; then
if grep -iq " hard" "$QEMU_PTY"; then
info "Windows started succesfully, visit http://localhost:8006/ to view the screen..."
return 0
if [ "$(stat -c%s "$QEMU_PTY")" -gt 7 ]; then
if ! grep -Fq "BOOTMGR is missing" "$QEMU_PTY"; then
info "Windows started succesfully, visit http://localhost:8006/ to view the screen..."
return 0
fi
fi
fi
@@ -48,12 +50,14 @@ ready() {
local bios="Booting from Hard"
last=$(grep "^Booting.*" "$QEMU_PTY" | tail -1)
if [[ "${last,,}" == "${bios,,}"* ]]; then
return 0
if ! grep -Fq "BOOTMGR is missing" "$QEMU_PTY"; then
return 0
fi
fi
return 1
fi
local line="Windows Boot Manager"
local line="\"Windows Boot Manager\""
if grep -Fq "$line" "$QEMU_PTY"; then
return 0
fi
@@ -81,11 +85,12 @@ finish() {
done
fi
if [ ! -f "$STORAGE/windows.boot" ] && [ -f "$STORAGE/$BASE" ]; then
if [ ! -f "$STORAGE/windows.boot" ] && [ -f "$BOOT" ]; then
# Remove CD-ROM ISO after install
if ready; then
if rm -f "$STORAGE/$BASE" 2>/dev/null; then
touch "$STORAGE/windows.boot"
touch "$STORAGE/windows.boot"
if [[ "$REMOVE" != [Nn]* ]]; then
rm -f "$BOOT" 2>/dev/null || true
fi
fi
fi
@@ -93,7 +98,9 @@ finish() {
pid="/var/run/tpm.pid"
[ -s "$pid" ] && pKill "$(<"$pid")"
fKill "wsdd"
pid="/var/run/wsdd.pid"
[ -s "$pid" ] && pKill "$(<"$pid")"
fKill "smbd"
closeNetwork

View File

@@ -14,10 +14,14 @@ if [[ "$DHCP" == [Yy1]* ]]; then
interface="$VM_NET_DEV"
fi
share="$STORAGE/shared"
share="/shared"
if [ ! -d "$share" ] && [ -d "$STORAGE/shared" ]; then
share="$STORAGE/shared"
fi
mkdir -p "$share"
[ -z "$(ls -A "$share")" ] && chmod -R 777 "$share"
[ -z "$(ls -A "$share")" ] && chmod 777 "$share"
{ echo "[global]"
echo " server string = Dockur"
@@ -53,16 +57,16 @@ mkdir -p "$share"
echo ""
echo "Using this folder you can share files with the host machine."
echo ""
echo "To change the storage location, include the following bind mount in your compose file:"
echo "To change its location, include the following bind mount in your compose file:"
echo ""
echo " volumes:"
echo " - \"/home/user/example:/storage/shared\""
echo " - \"/home/user/example:/shared\""
echo ""
echo "Or in your run command:"
echo ""
echo " -v \"/home/user/example:/storage/shared\""
echo " -v \"/home/user/example:/shared\""
echo ""
echo "Replace the example path /home/user/example with the desired storage folder."
echo "Replace the example path /home/user/example with the desired shared folder."
echo ""
} | unix2dos > "$share/readme.txt"
@@ -82,6 +86,7 @@ if [[ "$isXP" == [Yy1]* ]]; then
else
# Enable Web Service Discovery
wsdd -i "$interface" -p -n "$hostname" &
echo "$!" > /var/run/wsdd.pid
fi
return 0