mirror of
https://github.com/dockur/windows.git
synced 2026-01-13 22:45:43 +00:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f50b5d1564 | ||
|
|
bd3245595f | ||
|
|
7e4afc3c43 | ||
|
|
0fa4217d1b | ||
|
|
05896606cd | ||
|
|
aed184eb54 | ||
|
|
cbe7d6e565 | ||
|
|
8544ce03b2 | ||
|
|
515b6f51a4 | ||
|
|
f49a336efa | ||
|
|
537c8e8247 | ||
|
|
0f2717fec4 | ||
|
|
01f9603c47 | ||
|
|
41bab9d16d | ||
|
|
8c148ebbf1 | ||
|
|
7e970a8e18 |
@@ -1,5 +1,5 @@
|
||||
FROM scratch
|
||||
COPY --from=qemux/qemu-docker:4.13 / /
|
||||
COPY --from=qemux/qemu-docker:4.15 / /
|
||||
|
||||
ARG DEBCONF_NOWARNINGS="yes"
|
||||
ARG DEBIAN_FRONTEND "noninteractive"
|
||||
@@ -23,7 +23,7 @@ COPY ./src /run/
|
||||
COPY ./assets /run/assets
|
||||
|
||||
ADD https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py /usr/sbin/wsdd
|
||||
ADD https://github.com/qemus/virtiso/releases/download/v0.1.240/virtio-win-0.1.240.iso /run/drivers.iso
|
||||
ADD https://github.com/qemus/virtiso/releases/download/v0.1.248/virtio-win-0.1.248.iso /run/drivers.iso
|
||||
|
||||
RUN chmod +x /run/*.sh && chmod +x /usr/sbin/wsdd
|
||||
|
||||
|
||||
16
readme.md
16
readme.md
@@ -11,7 +11,7 @@
|
||||
|
||||
</div></h1>
|
||||
|
||||
Windows in a docker container.
|
||||
Windows in a Docker container.
|
||||
|
||||
## Features
|
||||
|
||||
@@ -44,7 +44,7 @@ services:
|
||||
Via `docker run`
|
||||
|
||||
```bash
|
||||
docker run -it --rm -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 120 dockurr/windows
|
||||
docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 120 dockurr/windows
|
||||
```
|
||||
|
||||
## FAQ
|
||||
@@ -94,6 +94,14 @@ docker run -it --rm -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
||||
|
||||
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 ment 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. One for [iOS](https://apps.apple.com/nl/app/microsoft-remote-desktop/id714464092?l=en-GB) is in the Apple Store. For Linux you can use [rdesktop](http://www.rdesktop.org/) and for Windows you don't need to install anything as it is already ships as part of the operating system.
|
||||
|
||||
* ### 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.
|
||||
@@ -136,7 +144,7 @@ docker run -it --rm -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
||||
|
||||
* ### How do I install a custom image?
|
||||
|
||||
In order to download a custom ISO image, start a clean container with the URL specified in the `VERSION` environment variable:
|
||||
In order to download a custom ISO image, start a clean container with the URL of the ISO specified in the `VERSION` environment variable:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
@@ -264,7 +272,7 @@ docker run -it --rm -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-ti
|
||||
|
||||
* ### Is this project legal?
|
||||
|
||||
Yes, this project contains only open-source code and does not distribute any copyrighted material. Neither does it try to circumvent any copyright protection measures. So under all applicable laws, this project would be considered legal.
|
||||
Yes, this project contains only open-source code and does not distribute any copyrighted material. Any product keys found in the code are just generic placeholders provided by Microsoft for trial purposes. So under all applicable laws, this project would be considered legal.
|
||||
|
||||
## Stars
|
||||
[](https://starchart.cc/dockur/windows)
|
||||
|
||||
@@ -72,7 +72,7 @@ fi
|
||||
|
||||
if [[ "${VERSION,,}" == "winxpx86" ]]; then
|
||||
DETECTED="winxpx86"
|
||||
VERSION="https://dl.bobpony.com/windows/xp/professional/en_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-73974.iso"
|
||||
VERSION="https://dl.bobpony.com/windows/xp/professional/en_windows_xp_professional_with_service_pack_3_x86_cd_x14-80428.iso"
|
||||
fi
|
||||
|
||||
if [[ "${VERSION,,}" == "core11" ]]; then
|
||||
@@ -90,15 +90,9 @@ if [[ "${VERSION,,}" == "tiny10" ]]; then
|
||||
VERSION="https://archive.org/download/tiny-10-23-h2/tiny10%20x64%2023h2.iso"
|
||||
fi
|
||||
|
||||
CUSTOM="custom.iso"
|
||||
|
||||
[ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="Custom.iso"
|
||||
[ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="custom.ISO"
|
||||
[ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="CUSTOM.ISO"
|
||||
[ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="custom.img"
|
||||
[ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="Custom.img"
|
||||
[ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="custom.IMG"
|
||||
[ ! -f "$STORAGE/$CUSTOM" ] && CUSTOM="CUSTOM.IMG"
|
||||
CUSTOM=$(find "$STORAGE" -maxdepth 1 -type f -iname custom.iso -printf "%f\n" | head -n 1)
|
||||
[ -z "$CUSTOM" ] && CUSTOM=$(find "$STORAGE" -maxdepth 1 -type f -iname boot.iso -printf "%f\n" | head -n 1)
|
||||
[ -z "$CUSTOM" ] && CUSTOM=$(find "$STORAGE" -maxdepth 1 -type f -iname custom.img -printf "%f\n" | head -n 1)
|
||||
|
||||
ESD_URL=""
|
||||
MACHINE="q35"
|
||||
@@ -205,31 +199,6 @@ getVersion() {
|
||||
return 0
|
||||
}
|
||||
|
||||
replaceXML() {
|
||||
|
||||
local dir="$1"
|
||||
local asset="$2"
|
||||
|
||||
local path="$dir/autounattend.xml"
|
||||
[ -f "$path" ] && cp "$asset" "$path"
|
||||
path="$dir/Autounattend.xml"
|
||||
[ -f "$path" ] && cp "$asset" "$path"
|
||||
path="$dir/AutoUnattend.xml"
|
||||
[ -f "$path" ] && cp "$asset" "$path"
|
||||
path="$dir/autounattend.XML"
|
||||
[ -f "$path" ] && cp "$asset" "$path"
|
||||
path="$dir/Autounattend.XML"
|
||||
[ -f "$path" ] && cp "$asset" "$path"
|
||||
path="$dir/AutoUnattend.XML"
|
||||
[ -f "$path" ] && cp "$asset" "$path"
|
||||
path="$dir/AUTOUNATTEND.xml"
|
||||
[ -f "$path" ] && cp "$asset" "$path"
|
||||
path="$dir/AUTOUNATTEND.XML"
|
||||
[ -f "$path" ] && cp "$asset" "$path"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
hasDisk() {
|
||||
|
||||
[ -b "${DEVICE:-}" ] && return 0
|
||||
@@ -313,6 +282,7 @@ startInstall() {
|
||||
|
||||
fi
|
||||
|
||||
[[ "${BASE,,}" == "boot."* ]] && BASE="windows.iso"
|
||||
[[ "${BASE,,}" == "custom."* ]] && BASE="windows.iso"
|
||||
|
||||
fi
|
||||
@@ -681,12 +651,19 @@ detectImage() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
local tag result name name2 desc
|
||||
local loc="$dir/sources/install.wim"
|
||||
[ ! -f "$loc" ] && loc="$dir/sources/install.esd"
|
||||
local src loc tag result name name2 desc
|
||||
src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1)
|
||||
|
||||
if [ ! -d "$src" ]; then
|
||||
warn "failed to locate 'sources' folder in ISO image, $FB"
|
||||
BOOT_MODE="windows_legacy"
|
||||
return 1
|
||||
fi
|
||||
|
||||
loc=$(find "$src" -maxdepth 1 -type f -iname install.wim | head -n 1)
|
||||
[ ! -f "$loc" ] && loc=$(find "$src" -maxdepth 1 -type f -iname install.esd | head -n 1)
|
||||
|
||||
if [ ! -f "$loc" ]; then
|
||||
|
||||
warn "failed to locate 'install.wim' or 'install.esd' in ISO image, $FB"
|
||||
BOOT_MODE="windows_legacy"
|
||||
return 1
|
||||
@@ -786,18 +763,12 @@ prepareXP() {
|
||||
sed -i '/^\[SCSI\]/s/$/\niaStor=\"Intel\(R\) SATA RAID\/AHCI Controller\"/' "$target/TXTSETUP.SIF"
|
||||
sed -i '/^\[HardwareIdsDatabase\]/s/$/\nPCI\\VEN_8086\&DEV_2922\&CC_0106=\"iaStor\"/' "$target/TXTSETUP.SIF"
|
||||
|
||||
rm -f "$target/winnt.sif"
|
||||
rm -f "$target/Winnt.sif"
|
||||
rm -f "$target/winnt.SIF"
|
||||
rm -f "$target/WinNT.sif"
|
||||
rm -f "$target/WINNT.sif"
|
||||
rm -f "$target/WINNT.SIF"
|
||||
# Windows XP Pro generic key (no activation)
|
||||
local key="DR8GV-C8V6J-BYXHG-7PYJR-DB66Y"
|
||||
|
||||
local key="M6TF9-8XQ2M-YQK9F-7TBB2-XGG88"
|
||||
[[ "${arch,,}" == "amd64" ]] && key="B66VY-4D94T-TPPD4-43F72-8X4FY"
|
||||
find "$target" -maxdepth 1 -type f -iname winnt.sif -exec rm {} \;
|
||||
|
||||
local sif="$target/WINNT.SIF"
|
||||
{ echo "[Data]"
|
||||
{ echo "[Data]"
|
||||
echo "AutoPartition=1"
|
||||
echo "MsDosInitiated=\"0\""
|
||||
echo "UnattendedInstall=\"Yes\""
|
||||
@@ -850,8 +821,9 @@ prepareXP() {
|
||||
echo ""
|
||||
echo "[TerminalServices]"
|
||||
echo "AllowConnections=1"
|
||||
} > "$sif"
|
||||
} | unix2dos > "$target/WINNT.SIF"
|
||||
|
||||
rm -rf "$drivers"
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -863,6 +835,8 @@ prepareLegacy() {
|
||||
ETFS="boot.img"
|
||||
BOOT_MODE="windows_legacy"
|
||||
|
||||
rm -f "$dir/$ETFS"
|
||||
|
||||
local len offset
|
||||
len=$(isoinfo -d -i "$iso" | grep "Nsect " | grep -o "[^ ]*$")
|
||||
offset=$(isoinfo -d -i "$iso" | grep "Bootoff " | grep -o "[^ ]*$")
|
||||
@@ -918,13 +892,23 @@ updateImage() {
|
||||
local iso="$1"
|
||||
local dir="$2"
|
||||
local asset="/run/assets/$3"
|
||||
local index result
|
||||
local path src loc index result
|
||||
|
||||
[ ! -f "$asset" ] && return 0
|
||||
replaceXML "$dir" "$asset"
|
||||
|
||||
local loc="$dir/sources/boot.wim"
|
||||
[ ! -f "$loc" ] && loc="$dir/sources/boot.esd"
|
||||
path=$(find "$dir" -maxdepth 1 -type f -iname autounattend.xml | head -n 1)
|
||||
[ -n "$path" ] && cp "$asset" "$path"
|
||||
|
||||
src=$(find "$dir" -maxdepth 1 -type d -iname sources | head -n 1)
|
||||
|
||||
if [ ! -d "$src" ]; then
|
||||
warn "failed to locate 'sources' folder in ISO image, $FB"
|
||||
BOOT_MODE="windows_legacy"
|
||||
return 1
|
||||
fi
|
||||
|
||||
loc=$(find "$src" -maxdepth 1 -type f -iname boot.wim | head -n 1)
|
||||
[ ! -f "$loc" ] && loc=$(find "$src" -maxdepth 1 -type f -iname boot.esd | head -n 1)
|
||||
|
||||
if [ ! -f "$loc" ]; then
|
||||
warn "failed to locate 'boot.wim' or 'boot.esd' in ISO image, $FB"
|
||||
|
||||
@@ -571,7 +571,7 @@ verify_media() {
|
||||
# IMPORTANT: These checksums are not necessarily subject to being updated
|
||||
# Unfortunately, the maintenance burden would be too large and even if I did there would still be some time gap between Microsoft releasing a new ISO and me updating the checksum (also, users would have to update this script)
|
||||
# For these reasons, I've opted for a slightly more manual verification where you have to look up the checksum to see if it's a well-known Windows ISO checksum
|
||||
# Ultimately, you have to trust Microsft because they could still include a backdoor in the verified ISO (keeping Windows air gapped could help with this)
|
||||
# Ultimately, you have to trust Microsoft because they could still include a backdoor in the verified ISO (keeping Windows air gapped could help with this)
|
||||
# Community contributions for these checksums are welcome
|
||||
#
|
||||
# Leading backslash is to avoid prepending a newline while maintaining alignment
|
||||
|
||||
@@ -50,6 +50,8 @@ finish() {
|
||||
local pid
|
||||
local reason=$1
|
||||
|
||||
touch "$QEMU_END"
|
||||
|
||||
if [ -f "$QEMU_PID" ]; then
|
||||
|
||||
pid=$(<"$QEMU_PID")
|
||||
|
||||
Reference in New Issue
Block a user