Wine on Docker

Introduction

Wine is a common tool to run Windows applications on Linux. In this blog post, I would like to discuss how to run Windows applications, such as WeChat, via Wine in a Linux Docker container.

Docker Wine

We will quickly go through the Wine Dockerfile and the basic Wine usages. All the commands could also be translated to a native Ubuntu operating system.

Dockerfile

The following Dockerfile has the Wine, languages, Chinese fonts, and display scaling installed.

wine.Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
FROM ubuntu:20.04

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
software-properties-common \
ca-certificates \
language-pack-en \
language-pack-zh-han* \
locales \
locales-all \
wget

# Install Wine
RUN dpkg --add-architecture i386 && \
wget -nc https://dl.winehq.org/wine-builds/winehq.key && \
mv winehq.key /usr/share/keyrings/winehq-archive.key && \
wget -nc https://dl.winehq.org/wine-builds/ubuntu/dists/focal/winehq-focal.sources && \
mv winehq-focal.sources /etc/apt/sources.list.d/ && \
apt-get update -y && \
# Wine 7.0 stable has some issues with some games I tested
# Use Wine 7.11 staging instead
apt-get install -y --install-recommends winehq-staging

# GStreamer plugins
RUN apt-get update -y && \
apt-get install -y --install-recommends \
gstreamer1.0-libav:i386 \
gstreamer1.0-plugins-bad:i386 \
gstreamer1.0-plugins-base:i386 \
gstreamer1.0-plugins-good:i386 \
gstreamer1.0-plugins-ugly:i386 \
gstreamer1.0-pulseaudio:i386

# Install dependencies for display scaling
RUN apt-get update -y && \
apt-get install -y --install-recommends \
build-essential \
bc \
git \
xpra \
xvfb \
python3 \
python3-pip

# Install OpenGL acceleration for display scaling
RUN pip3 install PyOpenGL==3.1.5 PyOpenGL_accelerate==3.1.5

# Install display scaling script
RUN cd /tmp && \
git clone https://github.com/kaueraal/run_scaled.git && \
cp /tmp/run_scaled/run_scaled /usr/local/bin/

# Install missing fonts for Chinese
RUN apt-get update -y && \
apt-get install -y --install-recommends \
fonts-wqy-microhei

# Install driver for Intel HD graphics
RUN apt-get -y install libgl1-mesa-glx libgl1-mesa-dri

ENV LC_ALL zh_CN.UTF-8
ENV LANG zh_CN.UTF-8
# Make sure the terminal is still English
ENV LANGUAGE en_US.UTF-8

Build Docker Image

To build the Docker image, please run the following command.

1
$ docker build -f wine.Dockerfile --tag=wine:20.04 .

Run Docker Container

To run the Docker container, please run the following command with additional Docker arguments if necessary.

1
2
3
4
5
6
7
8
9
10
11
$ xhost +
$ docker run \
-it \
--rm \
--device /dev/snd \
--device=/dev/dri \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-v $(pwd):/mnt \
wine:20.04
$ xhost -

Configure Wine

For Win32 applications, we create a directory ~/.wine32 to store the configurations.

1
$ WINEARCH=win32 WINEPREFIX=~/.wine32 winecfg

For Win64 applications, we create a directory ~/.wine64 to store the configurations.

1
$ WINEARCH=win64 WINEPREFIX=~/.wine64 winecfg

Run Application

For Win32 applications, we specify the Win32 configuration directory as WINEPREFIX before wine.

1
$ WINEPREFIX=~/.wine32 wine app.exe

For Win32 applications, we specify the Win64 configuration directory as WINEPREFIX before wine.

1
$ WINEPREFIX=~/.wine64 wine app.exe

Run Display Scaling

For some old applications, the display usually is very small. We could scale the display using a scaling script.

For example, to scale the display of app.exe by 1.5x, we could run the following command.

1
$ WINEPREFIX=~/.wine32 run_scaled --scale=1.5 wine app.exe

Example

We will use running Windows WeChat as an example.

Download WeChat

1
$ wget https://dldir1.qq.com/weixin/Windows/WeChatSetup.exe

Run Docker Container

1
2
3
4
5
6
7
8
9
10
11
12
$ xhost +
$ docker run \
-it \
--device /dev/snd \
--device=/dev/dri \
-e DISPLAY=$DISPLAY \
-e XMODIFIERS=@im=fcitx \
-e QT_IM_MODULE=fcitx \
-e GTK_IM_MODULE=fcitx \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-v $(pwd):/mnt \
wine:20.04

Notice --rm has been removed and -e XMODIFIERS=@im=fcitx, -e QT_IM_MODULE=fcitx, -e GTK_IM_MODULE=fcitx has been added to enable the fcitx input from the host computer.

Configure Wine

1
$ WINEARCH=win64 WINEPREFIX=~/.wine64 winecfg

Make sure virtual desktop is used in winecfg. In my case, I used resolution 2560 x 1440 for the virtual desktop.

Install WeChat

1
2
$ cd /mnt
$ WINEPREFIX=~/.wine64 wine WeChatSetup.exe

WeChat will be installed in ~/.wine64/drive_c/Program\ Files\ \(x86\)/Tencent/WeChat/WeChat.exe by default.

Run WeChat

1
$ WINEPREFIX=~/.wine64 wine ~/.wine64/drive_c/Program\ Files\ \(x86\)/Tencent/WeChat/WeChat.exe

I tried fcitx input from the host computer to the WeChat in the container and it worked fine.

References

Author

Lei Mao

Posted on

07-11-2022

Updated on

07-11-2022

Licensed under


Comments