Skip to content

Instantly share code, notes, and snippets.

@rgov
Created September 13, 2022 21:06
Show Gist options
  • Save rgov/1782fd5a61bc5c5d20241501ec77d92e to your computer and use it in GitHub Desktop.
Save rgov/1782fd5a61bc5c5d20241501ec77d92e to your computer and use it in GitHub Desktop.
Dockerfile starter for WINE + VNC that works with Apple Silicon

It is challenging to build a multi-platform Docker container capable of running 32-bit Windows (x86) binaries under WINE.

This Dockerfile shows one way to do so. The trick is to set up your apt source lists correctly, which is tricky to do if you are building on an ARM-based platform like a Rasberry Pi or Apple Silicon Mac.

This image is based on Ubuntu 22.04, though it should work with other Ubuntu releases.

# The apt repositories for ARM and Intel/AMD are hosted on different servers
# (ports.ubuntu.com vs archive.ubuntu.com), which requires some finagling to get
# apt's sources correct so we can install i386 packages regardless of our native
# platform.
#
# There are no official i386 containers for Ubuntu 20.04 "Focal" and newer, so
# we assume that we can use the amd64
ARG UBUNTU_VERSION=22.04
FROM --platform=linux/amd64 ubuntu:${UBUNTU_VERSION} AS amd64-base
ARG UBUNTU_VERSION
FROM ubuntu:${UBUNTU_VERSION}
# Copy the apt source list from the arm64 image, then patch it to use i386
COPY --from=amd64-base /etc/apt/sources.list /etc/apt/sources.list.d/i386.list
RUN sed -i -E -e 's/^deb /deb [arch=i386] /' /etc/apt/sources.list.d/i386.list \
&& sed -i -E -e 's/^deb /deb [arch='"$(dpkg --print-architecture)"'] /' \
/etc/apt/sources.list
# Install required packages
RUN export DEBIAN_FRONTEND=noninteractive \
&& dpkg --add-architecture i386 \
&& apt update \
&& apt install --no-install-recommends -y \
openbox \
winbind \
wine32:i386 \
wine-stable \
x11vnc \
xvfb \
&& rm -rf /var/lib/apt/lists/*
# Configure the virtual display port
ENV DISPLAY :0
# Configure WINE settings
ENV WINEDEBUG -all
ENV WINEPREFIX /wine/
# Expose VNC port
EXPOSE 5900
COPY ./start.sh
CMD [ "./start.sh" ]
#!/bin/bash -eu
VNC_PASSWORD=password
# Start VNC
# https://benjaminknofe.com/blog/2014/06/23/osx-compatible-x11vnc-start-up-command
Xvfb :0 -screen 0 1024x768x24 & \
openbox & \
x11vnc -passwd "$VNC_PASSWORD" -q -forever -loop -shared &
# Assuming you have copied ./foobar.exe to the container...
wine ./foobar.exe
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment