mirror of
https://github.com/hectorm/docker-qemu-reactos
synced 2025-04-03 06:16:56 +00:00
Compare commits
79 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
1dbbeb4fbd | ||
|
cb8849fc1e | ||
|
38c0c79d76 | ||
|
3e78cb0215 | ||
|
1a91d57625 | ||
|
5028c72619 | ||
|
a5d152ae24 | ||
|
3d5f2b942b | ||
|
af641b071b | ||
|
d602925a09 | ||
|
efd183861a | ||
|
4623b1e3c9 | ||
|
ae82178446 | ||
|
b6551ba201 | ||
|
e11cb75fe7 | ||
|
4bba179967 | ||
|
26879a25d1 | ||
|
eac2b07c5e | ||
|
f7f18c3d79 | ||
|
36e571bc18 | ||
|
6f8992051c | ||
|
21b6e9e4a1 | ||
|
7ac900a3a6 | ||
|
7efa177e18 | ||
|
f8989d290c | ||
|
cab0ceab3d | ||
|
77a3b127f1 | ||
|
883b7e28e6 | ||
|
e6ca925a94 | ||
|
a6b0870176 | ||
|
d08e483047 | ||
|
02047beb30 | ||
|
98a95a37ae | ||
|
dfe8ce097f | ||
|
f726ef51ca | ||
|
9518cdb808 | ||
|
b8e1431fdd | ||
|
8d2b773d50 | ||
|
114e5186cc | ||
|
aca7de648f | ||
|
af4005ca28 | ||
|
aec1c68eee | ||
|
f24db90bce | ||
|
2f5f595298 | ||
|
d08fa35863 | ||
|
823e89db2a | ||
|
764f04253b | ||
|
2885573d11 | ||
|
2c1d0324ff | ||
|
f6b8463bfa | ||
|
d909ccd1ef | ||
|
4dee4565b3 | ||
|
2d1ecf4c4d | ||
|
40e20bd753 | ||
|
5ce4479549 | ||
|
6bf0444e8f | ||
|
97ae8b86a9 | ||
|
d6ce907a7a | ||
|
daffd49dac | ||
|
4659e2b9da | ||
|
20808cf8a5 | ||
|
2f8f43e6f7 | ||
|
d3bb0c7b75 | ||
|
9bc4cbe849 | ||
|
2e3431c0ae | ||
|
cd9efa505c | ||
|
f25b06b04c | ||
|
ebaac7cb34 | ||
|
24337c3892 | ||
|
526a0afb0d | ||
|
4b18db3c42 | ||
|
bf8bcd369c | ||
|
407a6d48a8 | ||
|
099a608499 | ||
|
6dc6cc3d6c | ||
|
75f1a2e6f0 | ||
|
e9b0ec8326 | ||
|
a4a42cd203 | ||
|
5aaac72250 |
19
.github/dependabot.yml
vendored
Normal file
19
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
# yaml-language-server: $schema=https://json.schemastore.org/dependabot-2.0.json
|
||||
version: 2
|
||||
|
||||
updates:
|
||||
- package-ecosystem: "docker"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
groups:
|
||||
docker-all:
|
||||
patterns: ["*"]
|
||||
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
groups:
|
||||
github-actions-all:
|
||||
patterns: ["*"]
|
25
.github/workflows/ci.yml
vendored
25
.github/workflows/ci.yml
vendored
@ -1,25 +0,0 @@
|
||||
name: 'CI'
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: ['*']
|
||||
branches: ['*']
|
||||
pull_request:
|
||||
branches: ['*']
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
name: 'Build ${{ matrix.arch }} image'
|
||||
runs-on: 'ubuntu-latest'
|
||||
strategy:
|
||||
matrix:
|
||||
arch: ['amd64', 'arm64v8', 'arm32v7']
|
||||
steps:
|
||||
- name: 'Checkout project'
|
||||
uses: 'actions/checkout@v3'
|
||||
- name: 'Build image'
|
||||
run: |
|
||||
make binfmt-register
|
||||
make IMAGE_BUILD_OPTS="--pull" "build-${{ matrix.arch }}-image"
|
134
.github/workflows/main.yml
vendored
Normal file
134
.github/workflows/main.yml
vendored
Normal file
@ -0,0 +1,134 @@
|
||||
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
|
||||
name: "Main"
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: ["*"]
|
||||
branches: ["*"]
|
||||
pull_request:
|
||||
branches: ["*"]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
build-common-stages:
|
||||
name: "Build common stages"
|
||||
runs-on: "ubuntu-latest"
|
||||
permissions:
|
||||
contents: "read"
|
||||
strategy:
|
||||
matrix:
|
||||
stage: ["build"]
|
||||
steps:
|
||||
- name: "Checkout project"
|
||||
uses: "actions/checkout@v4"
|
||||
- name: "Build and save image"
|
||||
run: |
|
||||
make \
|
||||
IMAGE_REGISTRY="localhost" IMAGE_NAMESPACE="stage" IMAGE_PROJECT="${{ matrix.stage }}" \
|
||||
IMAGE_BUILD_OPTS="--pull --target ${{ matrix.stage }} --build-arg BUILDKIT_INLINE_CACHE=1" \
|
||||
build-native-image save-native-image
|
||||
- name: "Upload artifacts"
|
||||
uses: "actions/upload-artifact@v4"
|
||||
with:
|
||||
name: "dist-common-stages"
|
||||
path: "./dist/"
|
||||
retention-days: 1
|
||||
|
||||
build:
|
||||
name: "Build ${{ matrix.arch }} image"
|
||||
needs: ["build-common-stages"]
|
||||
runs-on: "ubuntu-latest"
|
||||
permissions:
|
||||
contents: "read"
|
||||
strategy:
|
||||
matrix:
|
||||
arch: ["native", "amd64", "arm64v8"]
|
||||
steps:
|
||||
- name: "Checkout project"
|
||||
uses: "actions/checkout@v4"
|
||||
- name: "Download artifacts"
|
||||
uses: "actions/download-artifact@v4"
|
||||
with:
|
||||
name: "dist-common-stages"
|
||||
path: "./dist/"
|
||||
- name: "Load common stages"
|
||||
run: |
|
||||
docker system prune --all --force
|
||||
make IMAGE_REGISTRY="localhost" IMAGE_NAMESPACE="stage" IMAGE_PROJECT="build" load-native-image clean
|
||||
- name: "Register binfmt entries"
|
||||
if: "matrix.arch != 'native'"
|
||||
run: |
|
||||
make binfmt-register
|
||||
- name: "Build and save image"
|
||||
run: |
|
||||
make \
|
||||
IMAGE_BUILD_OPTS="--cache-from localhost/stage/build:latest" \
|
||||
"build-${{ matrix.arch }}-image" "save-${{ matrix.arch }}-image"
|
||||
- name: "Upload artifacts"
|
||||
if: "startsWith(github.ref, 'refs/tags/v') && matrix.arch != 'native'"
|
||||
uses: "actions/upload-artifact@v4"
|
||||
with:
|
||||
name: "dist-${{ matrix.arch }}"
|
||||
path: "./dist/"
|
||||
retention-days: 1
|
||||
|
||||
push:
|
||||
name: "Push ${{ matrix.arch }} image"
|
||||
if: "startsWith(github.ref, 'refs/tags/v')"
|
||||
needs: ["build"]
|
||||
runs-on: "ubuntu-latest"
|
||||
permissions:
|
||||
contents: "read"
|
||||
strategy:
|
||||
matrix:
|
||||
arch: ["amd64", "arm64v8"]
|
||||
steps:
|
||||
- name: "Checkout project"
|
||||
uses: "actions/checkout@v4"
|
||||
- name: "Download artifacts"
|
||||
uses: "actions/download-artifact@v4"
|
||||
with:
|
||||
name: "dist-${{ matrix.arch }}"
|
||||
path: "./dist/"
|
||||
- name: "Login to Docker Hub"
|
||||
uses: "docker/login-action@v3"
|
||||
with:
|
||||
registry: "docker.io"
|
||||
username: "${{ secrets.DOCKERHUB_USERNAME }}"
|
||||
password: "${{ secrets.DOCKERHUB_TOKEN }}"
|
||||
- name: "Load and push image"
|
||||
run: |
|
||||
make "load-${{ matrix.arch }}-image" "push-${{ matrix.arch }}-image"
|
||||
|
||||
push-manifest:
|
||||
name: "Push manifest"
|
||||
if: "startsWith(github.ref, 'refs/tags/v')"
|
||||
needs: ["push"]
|
||||
runs-on: "ubuntu-latest"
|
||||
permissions:
|
||||
contents: "read"
|
||||
steps:
|
||||
- name: "Checkout project"
|
||||
uses: "actions/checkout@v4"
|
||||
- name: "Login to Docker Hub"
|
||||
uses: "docker/login-action@v3"
|
||||
with:
|
||||
registry: "docker.io"
|
||||
username: "${{ secrets.DOCKERHUB_USERNAME }}"
|
||||
password: "${{ secrets.DOCKERHUB_TOKEN }}"
|
||||
- name: "Push manifest"
|
||||
run: |
|
||||
make push-cross-manifest
|
||||
|
||||
publish-github-release:
|
||||
name: "Publish GitHub release"
|
||||
if: "startsWith(github.ref, 'refs/tags/v')"
|
||||
needs: ["push-manifest"]
|
||||
runs-on: "ubuntu-latest"
|
||||
permissions:
|
||||
contents: "write"
|
||||
steps:
|
||||
- name: "Publish"
|
||||
uses: "hectorm/ghaction-release@066200d04c3549852afa243d631ea3dc93390f68"
|
22
.github/workflows/rebuild-latest-release.yml
vendored
Normal file
22
.github/workflows/rebuild-latest-release.yml
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
|
||||
name: "Rebuild latest release"
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "20 04 * * 1"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
trigger-rebuild:
|
||||
name: "Trigger rebuild"
|
||||
runs-on: "ubuntu-latest"
|
||||
permissions:
|
||||
actions: "write"
|
||||
contents: "read"
|
||||
steps:
|
||||
- name: "Trigger rebuild"
|
||||
uses: "hectorm/ghaction-trigger-workflow@04c79e7a4e0c0b94bbcff3829f38359e34f1ea9e"
|
||||
with:
|
||||
workflow-id: "main.yml"
|
@ -1,26 +0,0 @@
|
||||
name: 'Trigger rebuild of latest release'
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '20 04 * * 1'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
|
||||
trigger-rebuild:
|
||||
name: 'Trigger rebuild'
|
||||
runs-on: 'ubuntu-latest'
|
||||
steps:
|
||||
- name: 'REST API call'
|
||||
run: |
|
||||
curl -fsS --proto '=https' --tlsv1.3 \
|
||||
--url 'https://api.github.com/repos/${{ github.repository }}/actions/workflows/ci.yml/dispatches' \
|
||||
--header 'Authorization: Bearer ${{ secrets.PERSONAL_GITHUB_TOKEN }}' \
|
||||
--header 'Accept: application/vnd.github.v3+json' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data "$(curl -fsS --proto '=https' --tlsv1.3 \
|
||||
--url 'https://api.github.com/repos/${{ github.repository }}/releases/latest' \
|
||||
--header 'Authorization: Bearer ${{ secrets.PERSONAL_GITHUB_TOKEN }}' \
|
||||
--header 'Accept: application/vnd.github.v3+json' \
|
||||
--header 'Content-Type: application/json' \
|
||||
| jq -rc '{ ref: .tag_name }')"
|
@ -1,74 +0,0 @@
|
||||
stages:
|
||||
- 'build'
|
||||
- 'push'
|
||||
|
||||
variables:
|
||||
DOCKER_HOST: 'tcp://dockerd:2376'
|
||||
DOCKER_TLS_SAN: 'DNS:dockerd'
|
||||
DOCKER_TLS_CERTDIR: '/certs'
|
||||
DOCKER_DRIVER: 'overlay2'
|
||||
|
||||
default:
|
||||
image: 'docker.io/docker:latest'
|
||||
services:
|
||||
- name: 'docker.io/docker:dind'
|
||||
alias: 'dockerd'
|
||||
|
||||
.anchors:
|
||||
- &cmd_install_packages 'apk add --no-cache coreutils git m4 make zstd'
|
||||
- &cmd_docker_login_registry 'docker login -u "${CI_REGISTRY_USER:?}" -p "${CI_REGISTRY_PASSWORD:?}" "${CI_REGISTRY:?}"'
|
||||
- &matrix_arch ['amd64', 'arm64v8', 'arm32v7']
|
||||
- ®ex_version '/^v[0-9]+$/'
|
||||
|
||||
build:native:
|
||||
stage: 'build'
|
||||
except: [*regex_version]
|
||||
before_script:
|
||||
- *cmd_install_packages
|
||||
script:
|
||||
- 'make IMAGE_BUILD_OPTS="--pull" build-native-image save-native-image'
|
||||
artifacts:
|
||||
expire_in: '1 day'
|
||||
paths:
|
||||
- './dist/'
|
||||
|
||||
build:cross:
|
||||
stage: 'build'
|
||||
only: [*regex_version]
|
||||
parallel:
|
||||
matrix:
|
||||
- ARCH: *matrix_arch
|
||||
before_script:
|
||||
- *cmd_install_packages
|
||||
script:
|
||||
- 'make binfmt-register'
|
||||
- 'make IMAGE_BUILD_OPTS="--pull" "build-${ARCH:?}-image" "save-${ARCH:?}-image"'
|
||||
artifacts:
|
||||
expire_in: '1 week'
|
||||
paths:
|
||||
- './dist/'
|
||||
|
||||
push:cross:
|
||||
stage: 'push'
|
||||
needs: ['build:cross']
|
||||
only: [*regex_version]
|
||||
parallel:
|
||||
matrix:
|
||||
- ARCH: *matrix_arch
|
||||
before_script:
|
||||
- *cmd_install_packages
|
||||
- *cmd_docker_login_registry
|
||||
script:
|
||||
- 'make "load-${ARCH:?}-image" "push-${ARCH:?}-image"'
|
||||
|
||||
push:manifest:
|
||||
stage: 'push'
|
||||
needs: ['push:cross']
|
||||
only: [*regex_version]
|
||||
variables:
|
||||
DOCKER_CLI_EXPERIMENTAL: 'enabled'
|
||||
before_script:
|
||||
- *cmd_install_packages
|
||||
- *cmd_docker_login_registry
|
||||
script:
|
||||
- 'make push-cross-manifest'
|
@ -4,7 +4,7 @@ m4_changequote([[, ]])
|
||||
## "build" stage
|
||||
##################################################
|
||||
|
||||
FROM docker.io/ubuntu:20.04 AS build
|
||||
FROM --platform=${BUILDPLATFORM} docker.io/ubuntu:24.04 AS build
|
||||
|
||||
# Install system packages
|
||||
RUN export DEBIAN_FRONTEND=noninteractive \
|
||||
@ -22,17 +22,17 @@ RUN export DEBIAN_FRONTEND=noninteractive \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Download noVNC
|
||||
ARG NOVNC_VERSION=v1.3.0
|
||||
ARG NOVNC_VERSION=v1.5.0
|
||||
ARG NOVNC_TARBALL_URL=https://github.com/novnc/noVNC/archive/${NOVNC_VERSION}.tar.gz
|
||||
ARG NOVNC_TARBALL_CHECKSUM=ee8f91514c9ce9f4054d132f5f97167ee87d9faa6630379267e569d789290336
|
||||
ARG NOVNC_TARBALL_CHECKSUM=6a73e41f98388a5348b7902f54b02d177cb73b7e5eb0a7a0dcf688cc2c79b42a
|
||||
RUN curl -Lo /tmp/novnc.tgz "${NOVNC_TARBALL_URL:?}"
|
||||
RUN printf '%s' "${NOVNC_TARBALL_CHECKSUM:?} /tmp/novnc.tgz" | sha256sum -c
|
||||
RUN mkdir /tmp/novnc/ && tar -xzf /tmp/novnc.tgz --strip-components=1 -C /tmp/novnc/
|
||||
|
||||
# Download Websockify
|
||||
ARG WEBSOCKIFY_VERSION=v0.10.0
|
||||
ARG WEBSOCKIFY_VERSION=v0.12.0
|
||||
ARG WEBSOCKIFY_TARBALL_URL=https://github.com/novnc/websockify/archive/${WEBSOCKIFY_VERSION}.tar.gz
|
||||
ARG WEBSOCKIFY_TARBALL_CHECKSUM=7bd99b727e0be230f6f47f65fbe4bd2ae8b2aa3568350148bdf5cf440c4c6b4a
|
||||
ARG WEBSOCKIFY_TARBALL_CHECKSUM=37448ec992ef626f29558404cf6535592d02894ec1d5f0990a8c62621b39a967
|
||||
RUN curl -Lo /tmp/websockify.tgz "${WEBSOCKIFY_TARBALL_URL:?}"
|
||||
RUN printf '%s' "${WEBSOCKIFY_TARBALL_CHECKSUM:?} /tmp/websockify.tgz" | sha256sum -c
|
||||
RUN mkdir /tmp/websockify/ && tar -xzf /tmp/websockify.tgz --strip-components=1 -C /tmp/websockify/
|
||||
@ -59,14 +59,14 @@ RUN curl -Lo /tmp/samba.exe "${SAMBA_EXE_URL:?}"
|
||||
RUN printf '%s' "${SAMBA_EXE_CHECKSUM:?} /tmp/samba.exe" | sha256sum -c
|
||||
|
||||
# Download BusyBox
|
||||
ARG BUSYBOX_EXE_URL=https://frippery.org/files/busybox/busybox-w32-FRP-4487-gd239d2d52.exe
|
||||
ARG BUSYBOX_EXE_CHECKSUM=35e2b0db6d57a045188b9afc617aae52a6c8e2aa0205256c049f3537a48f879b
|
||||
ARG BUSYBOX_EXE_URL=https://frippery.org/files/busybox/busybox-w32-FRP-5398-g89ae34445.exe
|
||||
ARG BUSYBOX_EXE_CHECKSUM=e311f576b6222a6a30fc892c4be13bd42387bcca65563e7ffff7004b9460b86c
|
||||
RUN curl -Lo /tmp/busybox.exe "${BUSYBOX_EXE_URL:?}"
|
||||
RUN printf '%s' "${BUSYBOX_EXE_CHECKSUM:?} /tmp/busybox.exe" | sha256sum -c
|
||||
|
||||
# Download and install ReactOS
|
||||
ARG REACTOS_ISO_URL=https://downloads.sourceforge.net/reactos/ReactOS-0.4.14-release-19-ga575acb-iso.zip
|
||||
ARG REACTOS_ISO_CHECKSUM=afe34548b582a282448fb5cf885c899bf33e27fb72da7203163a0ce3d9d04a55
|
||||
ARG REACTOS_ISO_URL=https://downloads.sourceforge.net/reactos/ReactOS-0.4.14-release-119-gce0b4ff-iso.zip
|
||||
ARG REACTOS_ISO_CHECKSUM=2937a619c9988d9c697930160e378d21048069c74e224b5c5ff6be470784b7d8
|
||||
RUN curl -Lo /tmp/reactos.zip "${REACTOS_ISO_URL:?}"
|
||||
RUN printf '%s' "${REACTOS_ISO_CHECKSUM:?} /tmp/reactos.zip" | sha256sum -c
|
||||
RUN 7z e /tmp/reactos.zip -so '*.iso' > /tmp/reactos.iso \
|
||||
@ -82,7 +82,7 @@ RUN mkisofs -no-emul-boot -iso-level 4 -eltorito-boot loader/isoboot.bin -o /tmp
|
||||
&& timeout 900 qemu-system-x86_64 \
|
||||
-machine pc -smp 2 -m 512M -accel tcg \
|
||||
-device VGA -display none -serial stdio \
|
||||
-device e1000,netdev=n0 -netdev user,id=n0,restrict=on \
|
||||
-device e1000,netdev=n0 -netdev user,id=n0,ipv4=on,ipv6=off,net=10.0.2.0/24,host=10.0.2.2,dns=10.0.2.3,dhcpstart=10.0.2.15,restrict=on \
|
||||
-device ide-hd,id=disk0,bus=ide.0,drive=disk0 -blockdev driver=qcow2,node-name=disk0,file.driver=file,file.filename=/tmp/reactos.qcow2 \
|
||||
-device ide-cd,id=cd0,bus=ide.1,drive=cd0 -blockdev driver=raw,node-name=cd0,file.driver=file,file.filename=/tmp/reactos.iso,read-only=on \
|
||||
-boot order=cd,menu=off \
|
||||
@ -92,32 +92,28 @@ RUN mkisofs -no-emul-boot -iso-level 4 -eltorito-boot loader/isoboot.bin -o /tmp
|
||||
## "base" stage
|
||||
##################################################
|
||||
|
||||
m4_ifdef([[CROSS_ARCH]], [[FROM docker.io/CROSS_ARCH/ubuntu:20.04]], [[FROM docker.io/ubuntu:20.04]]) AS base
|
||||
m4_ifdef([[CROSS_QEMU]], [[COPY --from=docker.io/hectormolinero/qemu-user-static:latest CROSS_QEMU CROSS_QEMU]])
|
||||
m4_ifdef([[CROSS_ARCH]], [[FROM docker.io/CROSS_ARCH/ubuntu:24.04]], [[FROM docker.io/ubuntu:24.04]]) AS base
|
||||
|
||||
# Install system packages
|
||||
RUN export DEBIAN_FRONTEND=noninteractive \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
catatonit \
|
||||
net-tools \
|
||||
netcat-openbsd \
|
||||
procps \
|
||||
python3 \
|
||||
qemu-kvm \
|
||||
qemu-system-x86 \
|
||||
qemu-utils \
|
||||
rlwrap \
|
||||
runit \
|
||||
samba \
|
||||
tini \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Environment
|
||||
ENV VM_CPU=2
|
||||
ENV VM_RAM=1024M
|
||||
ENV VM_KEYBOARD=en-us
|
||||
ENV VM_NET_GUESTFWD_OPTIONS=guestfwd=tcp:10.0.2.254:445-cmd:"nc 127.0.0.1 445"
|
||||
ENV VM_NET_HOSTFWD_OPTIONS=hostfwd=tcp::2323-:23,hostfwd=tcp::5151-:51,hostfwd=tcp::3389-:3389
|
||||
ENV VM_NET_EXTRA_OPTIONS=
|
||||
ENV VM_KVM=true
|
||||
ENV SVDIR=/etc/service/
|
||||
@ -146,7 +142,7 @@ COPY --chown=root:root ./scripts/bin/ /usr/local/bin/
|
||||
RUN find /usr/local/bin/ -type d -not -perm 0755 -exec chmod 0755 '{}' ';'
|
||||
RUN find /usr/local/bin/ -type f -not -perm 0755 -exec chmod 0755 '{}' ';'
|
||||
|
||||
ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/container-init"]
|
||||
ENTRYPOINT ["/usr/bin/catatonit", "--", "/usr/local/bin/container-init"]
|
||||
|
||||
##################################################
|
||||
## "test" stage
|
||||
@ -157,8 +153,8 @@ FROM base AS test
|
||||
RUN if [ "$(uname -m)" = 'x86_64' ]; then \
|
||||
container-init & \
|
||||
printf '%s\n' 'The quick brown fox jumps over the lazy dog' > /mnt/in || exit 1; \
|
||||
printf '%s\n' '@echo off & smbclient -c "get /in C:/local; quit" //10.0.2.254/share noop & exit' | timeout 900 vmshell || exit 1; \
|
||||
printf '%s\n' '@echo off & smbclient -c "put C:/local /out; quit" //10.0.2.254/share noop & exit' | timeout 120 vmshell || exit 1; \
|
||||
printf '%s\n' '@echo off & smbclient -c "get /in C:/local; quit" //10.0.2.2/share noop & exit' | timeout 900 vmshell || exit 1; \
|
||||
printf '%s\n' '@echo off & smbclient -c "put C:/local /out; quit" //10.0.2.2/share noop & exit' | timeout 120 vmshell || exit 1; \
|
||||
cmp -s /mnt/in /mnt/out || exit 1; \
|
||||
fi
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
The MIT License (MIT)
|
||||
=====================
|
||||
|
||||
Copyright © 2022 Héctor Molinero Fernández
|
||||
Copyright © Héctor Molinero Fernández
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
80
Makefile
80
Makefile
@ -11,10 +11,17 @@ DISTDIR := ./dist
|
||||
DOCKERFILE_TEMPLATE := ./Dockerfile.m4
|
||||
|
||||
IMAGE_REGISTRY := docker.io
|
||||
IMAGE_NAMESPACE := hectormolinero
|
||||
IMAGE_NAMESPACE := hectorm
|
||||
IMAGE_PROJECT := qemu-reactos
|
||||
IMAGE_NAME := $(IMAGE_REGISTRY)/$(IMAGE_NAMESPACE)/$(IMAGE_PROJECT)
|
||||
IMAGE_VERSION := $(shell '$(GIT)' describe --abbrev=0 2>/dev/null || printf 'v0')
|
||||
ifeq ($(shell '$(GIT)' status --porcelain 2>/dev/null),)
|
||||
IMAGE_GIT_TAG := $(shell '$(GIT)' tag --list --contains HEAD 2>/dev/null)
|
||||
IMAGE_GIT_SHA := $(shell '$(GIT)' rev-parse --verify --short HEAD 2>/dev/null)
|
||||
IMAGE_VERSION := $(if $(IMAGE_GIT_TAG),$(IMAGE_GIT_TAG),$(if $(IMAGE_GIT_SHA),$(IMAGE_GIT_SHA),nil))
|
||||
else
|
||||
IMAGE_GIT_BRANCH := $(shell '$(GIT)' symbolic-ref --short HEAD 2>/dev/null)
|
||||
IMAGE_VERSION := $(if $(IMAGE_GIT_BRANCH),$(IMAGE_GIT_BRANCH)-dirty,nil)
|
||||
endif
|
||||
|
||||
IMAGE_BUILD_OPTS :=
|
||||
|
||||
@ -24,8 +31,6 @@ IMAGE_AMD64_DOCKERFILE := $(DISTDIR)/Dockerfile.amd64
|
||||
IMAGE_AMD64_TARBALL := $(DISTDIR)/$(IMAGE_PROJECT).amd64.tzst
|
||||
IMAGE_ARM64V8_DOCKERFILE := $(DISTDIR)/Dockerfile.arm64v8
|
||||
IMAGE_ARM64V8_TARBALL := $(DISTDIR)/$(IMAGE_PROJECT).arm64v8.tzst
|
||||
IMAGE_ARM32V7_DOCKERFILE := $(DISTDIR)/Dockerfile.arm32v7
|
||||
IMAGE_ARM32V7_TARBALL := $(DISTDIR)/$(IMAGE_PROJECT).arm32v7.tzst
|
||||
|
||||
export DOCKER_BUILDKIT := 1
|
||||
export BUILDKIT_PROGRESS := plain
|
||||
@ -48,14 +53,14 @@ $(IMAGE_NATIVE_DOCKERFILE): $(DOCKERFILE_TEMPLATE)
|
||||
mkdir -p '$(DISTDIR)'
|
||||
'$(M4)' \
|
||||
--prefix-builtins \
|
||||
'$(DOCKERFILE_TEMPLATE)' | cat --squeeze-blank > '$@'
|
||||
'$(DOCKERFILE_TEMPLATE)' > '$@'
|
||||
'$(DOCKER)' build $(IMAGE_BUILD_OPTS) \
|
||||
--tag '$(IMAGE_NAME):$(IMAGE_VERSION)' \
|
||||
--tag '$(IMAGE_NAME):latest' \
|
||||
--file '$@' ./
|
||||
|
||||
.PHONY: build-cross-images
|
||||
build-cross-images: build-amd64-image build-arm64v8-image build-arm32v7-image
|
||||
build-cross-images: build-amd64-image build-arm64v8-image
|
||||
|
||||
.PHONY: build-amd64-image
|
||||
build-amd64-image: $(IMAGE_AMD64_DOCKERFILE)
|
||||
@ -65,11 +70,11 @@ $(IMAGE_AMD64_DOCKERFILE): $(DOCKERFILE_TEMPLATE)
|
||||
'$(M4)' \
|
||||
--prefix-builtins \
|
||||
--define=CROSS_ARCH=amd64 \
|
||||
--define=CROSS_QEMU=/usr/bin/qemu-x86_64-static \
|
||||
'$(DOCKERFILE_TEMPLATE)' | cat --squeeze-blank > '$@'
|
||||
'$(DOCKERFILE_TEMPLATE)' > '$@'
|
||||
'$(DOCKER)' build $(IMAGE_BUILD_OPTS) \
|
||||
--tag '$(IMAGE_NAME):$(IMAGE_VERSION)-amd64' \
|
||||
--tag '$(IMAGE_NAME):latest-amd64' \
|
||||
--platform linux/amd64 \
|
||||
--file '$@' ./
|
||||
|
||||
.PHONY: build-arm64v8-image
|
||||
@ -80,26 +85,11 @@ $(IMAGE_ARM64V8_DOCKERFILE): $(DOCKERFILE_TEMPLATE)
|
||||
'$(M4)' \
|
||||
--prefix-builtins \
|
||||
--define=CROSS_ARCH=arm64v8 \
|
||||
--define=CROSS_QEMU=/usr/bin/qemu-aarch64-static \
|
||||
'$(DOCKERFILE_TEMPLATE)' | cat --squeeze-blank > '$@'
|
||||
'$(DOCKERFILE_TEMPLATE)' > '$@'
|
||||
'$(DOCKER)' build $(IMAGE_BUILD_OPTS) \
|
||||
--tag '$(IMAGE_NAME):$(IMAGE_VERSION)-arm64v8' \
|
||||
--tag '$(IMAGE_NAME):latest-arm64v8' \
|
||||
--file '$@' ./
|
||||
|
||||
.PHONY: build-arm32v7-image
|
||||
build-arm32v7-image: $(IMAGE_ARM32V7_DOCKERFILE)
|
||||
|
||||
$(IMAGE_ARM32V7_DOCKERFILE): $(DOCKERFILE_TEMPLATE)
|
||||
mkdir -p '$(DISTDIR)'
|
||||
'$(M4)' \
|
||||
--prefix-builtins \
|
||||
--define=CROSS_ARCH=arm32v7 \
|
||||
--define=CROSS_QEMU=/usr/bin/qemu-arm-static \
|
||||
'$(DOCKERFILE_TEMPLATE)' | cat --squeeze-blank > '$@'
|
||||
'$(DOCKER)' build $(IMAGE_BUILD_OPTS) \
|
||||
--tag '$(IMAGE_NAME):$(IMAGE_VERSION)-arm32v7' \
|
||||
--tag '$(IMAGE_NAME):latest-arm32v7' \
|
||||
--platform linux/arm64/v8 \
|
||||
--file '$@' ./
|
||||
|
||||
##################################################
|
||||
@ -107,7 +97,7 @@ $(IMAGE_ARM32V7_DOCKERFILE): $(DOCKERFILE_TEMPLATE)
|
||||
##################################################
|
||||
|
||||
define save_image
|
||||
'$(DOCKER)' save '$(1)' | zstd -T0 -19 > '$(2)'
|
||||
'$(DOCKER)' save '$(1)' | zstd -T0 > '$(2)'
|
||||
endef
|
||||
|
||||
.PHONY: save-native-image
|
||||
@ -117,7 +107,7 @@ $(IMAGE_NATIVE_TARBALL): $(IMAGE_NATIVE_DOCKERFILE)
|
||||
$(call save_image,$(IMAGE_NAME):$(IMAGE_VERSION),$@)
|
||||
|
||||
.PHONY: save-cross-images
|
||||
save-cross-images: save-amd64-image save-arm64v8-image save-arm32v7-image
|
||||
save-cross-images: save-amd64-image save-arm64v8-image
|
||||
|
||||
.PHONY: save-amd64-image
|
||||
save-amd64-image: $(IMAGE_AMD64_TARBALL)
|
||||
@ -131,12 +121,6 @@ save-arm64v8-image: $(IMAGE_ARM64V8_TARBALL)
|
||||
$(IMAGE_ARM64V8_TARBALL): $(IMAGE_ARM64V8_DOCKERFILE)
|
||||
$(call save_image,$(IMAGE_NAME):$(IMAGE_VERSION)-arm64v8,$@)
|
||||
|
||||
.PHONY: save-arm32v7-image
|
||||
save-arm32v7-image: $(IMAGE_ARM32V7_TARBALL)
|
||||
|
||||
$(IMAGE_ARM32V7_TARBALL): $(IMAGE_ARM32V7_DOCKERFILE)
|
||||
$(call save_image,$(IMAGE_NAME):$(IMAGE_VERSION)-arm32v7,$@)
|
||||
|
||||
##################################################
|
||||
## "load-*" targets
|
||||
##################################################
|
||||
@ -155,7 +139,7 @@ load-native-image:
|
||||
$(call tag_image,$(IMAGE_NAME):$(IMAGE_VERSION),$(IMAGE_NAME):latest)
|
||||
|
||||
.PHONY: load-cross-images
|
||||
load-cross-images: load-amd64-image load-arm64v8-image load-arm32v7-image
|
||||
load-cross-images: load-amd64-image load-arm64v8-image
|
||||
|
||||
.PHONY: load-amd64-image
|
||||
load-amd64-image:
|
||||
@ -167,11 +151,6 @@ load-arm64v8-image:
|
||||
$(call load_image,$(IMAGE_ARM64V8_TARBALL))
|
||||
$(call tag_image,$(IMAGE_NAME):$(IMAGE_VERSION)-arm64v8,$(IMAGE_NAME):latest-arm64v8)
|
||||
|
||||
.PHONY: load-arm32v7-image
|
||||
load-arm32v7-image:
|
||||
$(call load_image,$(IMAGE_ARM32V7_TARBALL))
|
||||
$(call tag_image,$(IMAGE_NAME):$(IMAGE_VERSION)-arm32v7,$(IMAGE_NAME):latest-arm32v7)
|
||||
|
||||
##################################################
|
||||
## "push-*" targets
|
||||
##################################################
|
||||
@ -181,10 +160,9 @@ define push_image
|
||||
endef
|
||||
|
||||
define push_cross_manifest
|
||||
'$(DOCKER)' manifest create --amend '$(1)' '$(2)-amd64' '$(2)-arm64v8' '$(2)-arm32v7'
|
||||
'$(DOCKER)' manifest create --amend '$(1)' '$(2)-amd64' '$(2)-arm64v8'
|
||||
'$(DOCKER)' manifest annotate '$(1)' '$(2)-amd64' --os linux --arch amd64
|
||||
'$(DOCKER)' manifest annotate '$(1)' '$(2)-arm64v8' --os linux --arch arm64 --variant v8
|
||||
'$(DOCKER)' manifest annotate '$(1)' '$(2)-arm32v7' --os linux --arch arm --variant v7
|
||||
'$(DOCKER)' manifest push --purge '$(1)'
|
||||
endef
|
||||
|
||||
@ -193,7 +171,7 @@ push-native-image:
|
||||
@printf '%s\n' 'Unimplemented'
|
||||
|
||||
.PHONY: push-cross-images
|
||||
push-cross-images: push-amd64-image push-arm64v8-image push-arm32v7-image
|
||||
push-cross-images: push-amd64-image push-arm64v8-image
|
||||
|
||||
.PHONY: push-amd64-image
|
||||
push-amd64-image:
|
||||
@ -205,11 +183,6 @@ push-arm64v8-image:
|
||||
$(call push_image,$(IMAGE_NAME):$(IMAGE_VERSION)-arm64v8)
|
||||
$(call push_image,$(IMAGE_NAME):latest-arm64v8)
|
||||
|
||||
.PHONY: push-arm32v7-image
|
||||
push-arm32v7-image:
|
||||
$(call push_image,$(IMAGE_NAME):$(IMAGE_VERSION)-arm32v7)
|
||||
$(call push_image,$(IMAGE_NAME):latest-arm32v7)
|
||||
|
||||
push-cross-manifest:
|
||||
$(call push_cross_manifest,$(IMAGE_NAME):$(IMAGE_VERSION),$(IMAGE_NAME):$(IMAGE_VERSION))
|
||||
$(call push_cross_manifest,$(IMAGE_NAME):latest,$(IMAGE_NAME):latest)
|
||||
@ -220,7 +193,7 @@ push-cross-manifest:
|
||||
|
||||
.PHONY: binfmt-register
|
||||
binfmt-register:
|
||||
'$(DOCKER)' run --rm --privileged docker.io/hectormolinero/qemu-user-static:latest --reset
|
||||
'$(DOCKER)' run --rm --privileged docker.io/hectorm/qemu-user-static:latest --reset --persistent yes --credential yes
|
||||
|
||||
##################################################
|
||||
## "version" target
|
||||
@ -228,12 +201,13 @@ binfmt-register:
|
||||
|
||||
.PHONY: version
|
||||
version:
|
||||
@if printf '%s' '$(IMAGE_VERSION)' | grep -q '^v[0-9]\{1,\}$$'; then \
|
||||
NEW_IMAGE_VERSION=$$(awk -v 'v=$(IMAGE_VERSION)' 'BEGIN {printf "v%.0f", substr(v,2)+1}'); \
|
||||
@LATEST_IMAGE_VERSION=$$('$(GIT)' describe --abbrev=0 2>/dev/null || printf 'v0'); \
|
||||
if printf '%s' "$${LATEST_IMAGE_VERSION:?}" | grep -q '^v[0-9]\{1,\}$$'; then \
|
||||
NEW_IMAGE_VERSION=$$(awk -v v="$${LATEST_IMAGE_VERSION:?}" 'BEGIN {printf("v%.0f", substr(v,2)+1)}'); \
|
||||
'$(GIT)' commit --allow-empty -m "$${NEW_IMAGE_VERSION:?}"; \
|
||||
'$(GIT)' tag -a "$${NEW_IMAGE_VERSION:?}" -m "$${NEW_IMAGE_VERSION:?}"; \
|
||||
else \
|
||||
>&2 printf 'Malformed version string: %s\n' '$(IMAGE_VERSION)'; \
|
||||
>&2 printf 'Malformed version string: %s\n' "$${LATEST_IMAGE_VERSION:?}"; \
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
@ -243,6 +217,6 @@ version:
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f '$(IMAGE_NATIVE_DOCKERFILE)' '$(IMAGE_AMD64_DOCKERFILE)' '$(IMAGE_ARM64V8_DOCKERFILE)' '$(IMAGE_ARM32V7_DOCKERFILE)'
|
||||
rm -f '$(IMAGE_NATIVE_TARBALL)' '$(IMAGE_AMD64_TARBALL)' '$(IMAGE_ARM64V8_TARBALL)' '$(IMAGE_ARM32V7_TARBALL)'
|
||||
rm -f '$(IMAGE_NATIVE_DOCKERFILE)' '$(IMAGE_AMD64_DOCKERFILE)' '$(IMAGE_ARM64V8_DOCKERFILE)'
|
||||
rm -f '$(IMAGE_NATIVE_TARBALL)' '$(IMAGE_AMD64_TARBALL)' '$(IMAGE_ARM64V8_TARBALL)'
|
||||
if [ -d '$(DISTDIR)' ] && [ -z "$$(ls -A '$(DISTDIR)')" ]; then rmdir '$(DISTDIR)'; fi
|
||||
|
12
README.md
12
README.md
@ -9,13 +9,17 @@ docker run --detach \
|
||||
--device /dev/kvm \
|
||||
--publish 127.0.0.1:5900:5900/tcp \
|
||||
--publish 127.0.0.1:6080:6080/tcp \
|
||||
docker.io/hectormolinero/qemu-reactos:latest
|
||||
--mount type=volume,src=qemu-reactos-disk,dst=/var/lib/qemu/disk/ \
|
||||
docker.io/hectorm/qemu-reactos:latest
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> The `--device /dev/kvm` option can only be used on Linux hosts, it can be removed on Windows and macOS hosts at a significant performance penalty.
|
||||
|
||||
The instance can be accessed from:
|
||||
* **VNC (5900/TCP):** any VNC client, without credentials.
|
||||
* **noVNC (6080/TCP):** http://127.0.0.1:6080/vnc.html
|
||||
* **Shell:** `docker exec -it qemu-reactos vmshell`
|
||||
* **VNC** (`5900/TCP`), without password.
|
||||
* **noVNC** (`6080/TCP`), http://127.0.0.1:6080/vnc.html
|
||||
* `docker exec -it qemu-reactos vmshell`
|
||||
|
||||
## Environment variables
|
||||
#### `VM_CPU`
|
||||
|
2
run.sh
2
run.sh
@ -6,7 +6,7 @@ export LC_ALL=C
|
||||
DOCKER=$(command -v docker 2>/dev/null)
|
||||
|
||||
IMAGE_REGISTRY=docker.io
|
||||
IMAGE_NAMESPACE=hectormolinero
|
||||
IMAGE_NAMESPACE=hectorm
|
||||
IMAGE_PROJECT=qemu-reactos
|
||||
IMAGE_TAG=latest
|
||||
IMAGE_NAME=${IMAGE_REGISTRY:?}/${IMAGE_NAMESPACE:?}/${IMAGE_PROJECT:?}:${IMAGE_TAG:?}
|
||||
|
@ -2,4 +2,4 @@
|
||||
|
||||
set -eu
|
||||
|
||||
printf '%s\n' 'system_powerdown' | nc -U /run/qemu-monitor
|
||||
printf '%s\n' 'system_powerdown' | nc -w 1 -U /run/qemu-monitor
|
||||
|
@ -5,7 +5,7 @@ set -eu
|
||||
set --
|
||||
set -- "$@" -machine pc -smp "${VM_CPU:?}" -m "${VM_RAM:?}"
|
||||
set -- "$@" -device VGA -display vnc=:0 -serial stdio -monitor unix:/run/qemu-monitor,server,nowait
|
||||
set -- "$@" -device e1000,netdev=n0 -netdev user,id=n0,"${VM_NET_GUESTFWD_OPTIONS?}","${VM_NET_HOSTFWD_OPTIONS?}","${VM_NET_EXTRA_OPTIONS?}"
|
||||
set -- "$@" -device e1000,netdev=n0 -netdev user,id=n0,ipv4=on,ipv6=off,net=10.0.2.0/24,host=10.0.2.2,dns=10.0.2.3,dhcpstart=10.0.2.15,hostfwd=tcp::2323-:23,hostfwd=tcp::5151-:51,hostfwd=tcp::3389-:3389,"${VM_NET_EXTRA_OPTIONS?}"
|
||||
set -- "$@" -device ide-hd,id=disk0,bus=ide.0,drive=disk0 -blockdev driver=qcow2,node-name=disk0,file.driver=file,file.filename=/var/lib/qemu/disk/reactos.qcow2
|
||||
set -- "$@" -usb -device usb-tablet
|
||||
set -- "$@" -k "${VM_KEYBOARD:?}"
|
||||
|
@ -2,6 +2,10 @@
|
||||
|
||||
set -eu
|
||||
|
||||
if [ ! -d /run/samba/ ]; then
|
||||
install -m 755 -o root -g root -d /run/samba/
|
||||
fi
|
||||
|
||||
cd /run/samba/
|
||||
exec 2>&1
|
||||
exec /usr/sbin/smbd --foreground --log-stdout --debuglevel=3
|
||||
exec /usr/sbin/smbd --foreground --debug-stdout --debuglevel=3
|
||||
|
Loading…
Reference in New Issue
Block a user