#!/usr/bin/docker # ____ __ ____ ______ __ # / __ \____ _____/ /_____ _____/ __ \/ ___/ |/ / # / / / / __ \/ ___/ //_/ _ \/ ___/ / / /\__ \| / # / /_/ / /_/ / /__/ ,< / __/ / / /_/ /___/ / | # /_____/\____/\___/_/|_|\___/_/ \____//____/_/|_| [MONTEREY] # # Title: Docker-OSX (Mac on Docker) # Author: Sick.Codes https://twitter.com/sickcodes # Version: 6.0 # License: GPLv3+ # Repository: https://github.com/sickcodes/Docker-OSX # Website: https://sick.codes # # Notes: Uses a self-hosted BaseSystem.img from a USB installer. # If you want to DIY, use https://github.com/corpnewt/gibMacOS # Set seed as developer, and install the Install Assistant on Big Sur # Burn to a USB, and pull out BaseSystem.img # Or download from https://images.sick.codes/BaseSystem_Monterey.dmg # FROM sickcodes/docker-osx LABEL maintainer='https://twitter.com/sickcodes ' SHELL ["/bin/bash", "-c"] # change disk size here or add during build, e.g. --build-arg VERSION=10.14.5 --build-arg SIZE=50G ARG SIZE=200G ARG BASE_SYSTEM='https://images.sick.codes/BaseSystem_Monterey.dmg' WORKDIR /home/arch/OSX-KVM RUN wget -O BaseSystem.dmg "${BASE_SYSTEM}" \ && qemu-img convert BaseSystem.dmg -O qcow2 -p -c BaseSystem.img \ && rm -f BaseSystem.dmg RUN qemu-img create -f qcow2 /home/arch/OSX-KVM/mac_hdd_ng.img "${SIZE}" WORKDIR /home/arch/OSX-KVM #### libguestfs versioning # 5.13+ problem resolved by building the qcow2 against 5.12 using libguestfs-1.44.1-6 ENV SUPERMIN_KERNEL=/boot/vmlinuz-linux ENV SUPERMIN_MODULES=/lib/modules/5.12.14-arch1-1 ENV SUPERMIN_KERNEL_VERSION=5.12.14-arch1-1 ENV KERNEL_PACKAGE_URL=https://archive.archlinux.org/packages/l/linux/linux-5.12.14.arch1-1-x86_64.pkg.tar.zst ENV KERNEL_HEADERS_PACKAGE_URL=https://archive.archlinux.org/packages/l/linux/linux-headers-5.12.14.arch1-1-x86_64.pkg.tar.zst ENV LIBGUESTFS_PACKAGE_URL=https://archive.archlinux.org/packages/l/libguestfs/libguestfs-1.44.1-6-x86_64.pkg.tar.zst ARG LINUX=true # required to use libguestfs inside a docker container, to create bootdisks for docker-osx on-the-fly RUN if [[ "${LINUX}" == true ]]; then \ sudo pacman -U "${KERNEL_PACKAGE_URL}" --noconfirm \ ; sudo pacman -U "${LIBGUESTFS_PACKAGE_URL}" --noconfirm \ ; sudo pacman -U "${KERNEL_HEADERS_PACKAGE_URL}" --noconfirm \ ; sudo pacman -S mkinitcpio --noconfirm \ ; sudo libguestfs-test-tool \ ; sudo rm -rf /var/tmp/.guestfs-* \ ; fi #### # optional --build-arg to change branches for testing ARG BRANCH=master ARG REPO='https://github.com/sickcodes/Docker-OSX.git' # RUN git clone --recurse-submodules --depth 1 --branch "${BRANCH}" "${REPO}" RUN rm -rf ./Docker-OSX \ && git clone --recurse-submodules --depth 1 --branch "${BRANCH}" "${REPO}" RUN touch Launch.sh \ && chmod +x ./Launch.sh \ && tee -a Launch.sh <<< '#!/bin/bash' \ && tee -a Launch.sh <<< 'set -eux' \ && tee -a Launch.sh <<< 'sudo chown $(id -u):$(id -g) /dev/kvm 2>/dev/null || true' \ && tee -a Launch.sh <<< 'sudo chown -R $(id -u):$(id -g) /dev/snd 2>/dev/null || true' \ && tee -a Launch.sh <<< '[[ "${RAM}" = max ]] && export RAM="$(("$(head -n1 /proc/meminfo | tr -dc "[:digit:]") / 1000000"))"' \ && tee -a Launch.sh <<< '[[ "${RAM}" = half ]] && export RAM="$(("$(head -n1 /proc/meminfo | tr -dc "[:digit:]") / 2000000"))"' \ && tee -a Launch.sh <<< 'sudo chown -R $(id -u):$(id -g) /dev/snd 2>/dev/null || true' \ && tee -a Launch.sh <<< 'exec qemu-system-x86_64 -m ${RAM:-2}000 \' \ && tee -a Launch.sh <<< '-cpu ${CPU:-Penryn},${CPUID_FLAGS:-vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check,}${BOOT_ARGS} \' \ && tee -a Launch.sh <<< '-machine q35,${KVM-"accel=kvm:tcg"} \' \ && tee -a Launch.sh <<< '-smp ${CPU_STRING:-${SMP:-4},cores=${CORES:-4}} \' \ && tee -a Launch.sh <<< '-usb -device usb-kbd -device usb-tablet \' \ && tee -a Launch.sh <<< '-device isa-applesmc,osk=ourhardworkbythesewordsguardedpleasedontsteal\(c\)AppleComputerInc \' \ && tee -a Launch.sh <<< '-drive if=pflash,format=raw,readonly=on,file=/home/arch/OSX-KVM/OVMF_CODE.fd \' \ && tee -a Launch.sh <<< '-drive if=pflash,format=raw,file=/home/arch/OSX-KVM/OVMF_VARS-1024x768.fd \' \ && tee -a Launch.sh <<< '-smbios type=2 \' \ && tee -a Launch.sh <<< '-audiodev ${AUDIO_DRIVER:-alsa},id=hda -device ich9-intel-hda -device hda-duplex,audiodev=hda \' \ && tee -a Launch.sh <<< '-device ich9-ahci,id=sata \' \ && tee -a Launch.sh <<< '-drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file=${BOOTDISK:-/home/arch/OSX-KVM/OpenCore/OpenCore.qcow2} \' \ && tee -a Launch.sh <<< '-device ide-hd,bus=sata.2,drive=OpenCoreBoot \' \ && tee -a Launch.sh <<< '-device ide-hd,bus=sata.3,drive=InstallMedia \' \ && tee -a Launch.sh <<< '-drive id=InstallMedia,if=none,file=/home/arch/OSX-KVM/BaseSystem.img,format=qcow2 \' \ && tee -a Launch.sh <<< '-drive id=MacHDD,if=none,file=${IMAGE_PATH:-/home/arch/OSX-KVM/mac_hdd_ng.img},format=${IMAGE_FORMAT:-qcow2} \' \ && tee -a Launch.sh <<< '-device ide-hd,bus=sata.4,drive=MacHDD \' \ && tee -a Launch.sh <<< '-netdev user,id=net0,hostfwd=tcp::${INTERNAL_SSH_PORT:-10022}-:22,hostfwd=tcp::${SCREEN_SHARE_PORT:-5900}-:5900,${ADDITIONAL_PORTS} \' \ && tee -a Launch.sh <<< '-device ${NETWORKING:-vmxnet3},netdev=net0,id=net0,mac=${MAC_ADDRESS:-52:54:00:09:49:17} \' \ && tee -a Launch.sh <<< '-monitor stdio \' \ && tee -a Launch.sh <<< '-boot menu=on \' \ && tee -a Launch.sh <<< '-vga vmware \' \ && tee -a Launch.sh <<< '${EXTRA:-}' # docker exec containerid mv ./Launch-nopicker.sh ./Launch.sh # This is now a legacy command. # You can use -e BOOTDISK=/bootdisk with -v ./bootdisk.img:/bootdisk RUN grep -v InstallMedia ./Launch.sh > ./Launch-nopicker.sh \ && chmod +x ./Launch-nopicker.sh \ && sed -i -e s/OpenCore\.qcow2/OpenCore\-nopicker\.qcow2/ ./Launch-nopicker.sh USER arch ENV USER arch #### libguestfs versioning # 5.13+ problem resolved by building the qcow2 against 5.12 using libguestfs-1.44.1-6 ENV SUPERMIN_KERNEL=/boot/vmlinuz-linux ENV SUPERMIN_MODULES=/lib/modules/5.12.14-arch1-1 ENV SUPERMIN_KERNEL_VERSION=5.12.14-arch1-1 ENV KERNEL_PACKAGE_URL=https://archive.archlinux.org/packages/l/linux/linux-5.12.14.arch1-1-x86_64.pkg.tar.zst ENV KERNEL_HEADERS_PACKAGE_URL=https://archive.archlinux.org/packages/l/linux/linux-headers-5.12.14.arch1-1-x86_64.pkg.tar.zst ENV LIBGUESTFS_PACKAGE_URL=https://archive.archlinux.org/packages/l/libguestfs/libguestfs-1.44.1-6-x86_64.pkg.tar.zst RUN sudo pacman -Syy \ && sudo pacman -Rns linux --noconfirm \ ; sudo pacman -S mkinitcpio --noconfirm \ && sudo pacman -U "${KERNEL_PACKAGE_URL}" --noconfirm \ && sudo pacman -U "${LIBGUESTFS_PACKAGE_URL}" --noconfirm \ && rm -rf /var/tmp/.guestfs-* \ ; libguestfs-test-tool || exit 1 #### # symlink the old directory, for redundancy RUN ln -s /home/arch/OSX-KVM/OpenCore /home/arch/OSX-KVM/OpenCore-Catalina || true #### #### SPECIAL RUNTIME ARGUMENTS BELOW # env -e ADDITIONAL_PORTS with a comma # for example, -e ADDITIONAL_PORTS=hostfwd=tcp::23-:23, ENV ADDITIONAL_PORTS= # add additional QEMU boot arguments ENV BOOT_ARGS= ENV BOOTDISK= # edit the CPU that is being emulated ENV CPU=Penryn ENV CPUID_FLAGS='vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check,' ENV DISPLAY=:0.0 # Deprecated ENV ENV=/env # Boolean for generating a bootdisk with new random serials. ENV GENERATE_UNIQUE=false # Boolean for generating a bootdisk with specific serials. ENV GENERATE_SPECIFIC=false ENV IMAGE_PATH=/home/arch/OSX-KVM/mac_hdd_ng.img ENV IMAGE_FORMAT=qcow2 ENV KVM='accel=kvm:tcg' ENV MASTER_PLIST_URL="https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist" # ENV NETWORKING=e1000-82545em ENV NETWORKING=vmxnet3 # boolean for skipping the disk selection menu at in the boot process ENV NOPICKER=false # dynamic RAM options for runtime ENV RAM=3 # ENV RAM=max # ENV RAM=half # The x and y coordinates for resolution. # Must be used with either -e GENERATE_UNIQUE=true or -e GENERATE_SPECIFIC=true. ENV WIDTH=1920 ENV HEIGHT=1080 # libguestfs verbose ENV LIBGUESTFS_DEBUG=1 ENV LIBGUESTFS_TRACE=1 VOLUME ["/tmp/.X11-unix"] # check if /image is a disk image or a directory. This allows you to optionally use -v disk.img:/image # NOPICKER is used to skip the disk selection screen # GENERATE_UNIQUE is used to generate serial numbers on boot. # /env is a file that you can generate and save using -v source.sh:/env # the env file is a file that you can carry to the next container which will supply the serials numbers. # GENERATE_SPECIFIC is used to either accept the env serial numbers OR you can supply using: # -e DEVICE_MODEL="iMacPro1,1" \ # -e SERIAL="C02TW0WAHX87" \ # -e BOARD_SERIAL="C027251024NJG36UE" \ # -e UUID="5CCB366D-9118-4C61-A00A-E5BAF3BED451" \ # -e MAC_ADDRESS="A8:5C:2C:9A:46:2F" \ # the output will be /bootdisk. # /bootdisk is a useful persistent place to store the 15Mb serial number bootdisk. # if you don't set any of the above: # the default serial numbers are already contained in ./OpenCore/OpenCore.qcow2 # And the default serial numbers COPY entrypoint.monterey.sh ./entrypoint.sh CMD ["bash", "-c", "entrypoint.sh"] # virt-manager mode: eta son # CMD virsh define <(envsubst < Docker-OSX.xml) && virt-manager || virt-manager # CMD virsh define <(envsubst < macOS-libvirt-Catalina.xml) && virt-manager || virt-manager