Run simple X11 app in docker container on Ubuntu 20.04

I am following this example of how to run an X11 app in a docker container. I am on Ubuntu 20.04 and using X11:

$ echo $XDG_SESSION_TYPE
x11

My Dockerfile:

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y x11-apps
ARG user=hakon
ARG home=/home/$user
RUN groupadd -g 1000 $user
RUN useradd -d $home -s /bin/bash -m $user -u 1000 -g 1000 \
        && echo $user:ubuntu | chpasswd \
        && adduser $user sudo
WORKDIR $home
USER $user
ENV HOME $home
COPY entrypoint.sh .
ENTRYPOINT ["./entrypoint.sh"] 

where entrypoint.sh is:

echo "DISPLAY=$DISPLAY"
xclock  # <-- This is the X11 application I am testing with. It shows a clock in a Window
echo "Done."
exec bash

I build the image using:

$ docker build -t gui-test-ubuntu-2004 .

Then run the container with:

$ docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
       -h $HOSTNAME -v $HOME/.Xauthority:/home/hakon/.Xauthority gui-test-ubuntu-2004

The output is:

DISPLAY=:0
Error: Can't open display: :0
Done.

and the xclock gui window is not showing. What am I missing here?


The problem is most likely that you installed docker with snap. According to mviereck the maintainer of x11docker

snap causes several restictions. --hostdisplay does not work because it is not possible to share unix sockets from host, in this case the X unix socket in /tmp/.X11-unix

A workaround is to an Xephyr X server with x11docker. Instead of running docker run ... gui-test-ubuntu-2004, use:

x11docker --xephyr gui-test-ubuntu-2004

The second alternative is to remove the snap installation of docker, see this answer, and then reinstall docker with apt-get install:

  1. Remove docker:

     sudo snap remove docker
    
  2. Go to https://download.docker.com/linux/ubuntu/dists/ and choose your Ubuntu version, then browse to pool/stable/ and download the 3 .deb files:

    • containerd.io_1.2.13-2_amd64.deb

    • docker-ce_19.03.11_3-0_ubuntu-focal_amd64.deb

    • docker-ce-cli_19.03.11_3-0_ubuntu-focal_amd64.deb

  3. Install them in the following order:

     sudo apt-get install ./containerd.io_1.2.13-2_amd64.deb
     sudo apt-get install ./docker-ce-cli_19.03.11_3-0_ubuntu-focal_amd64.deb
     sudo apt-get install ./docker-ce_19.03.11_3-0_ubuntu-focal_amd64.deb
    
  4. Add your user to the docker group to avoid having to type sudo to run docker:

    sudo addgroup --system docker
    sudo usermod -a -G docker $USER
    
  5. Restart the computer at this point to activate the new user and group settings

  6. Test the docker installation by running :

    docker run hello-world
    

You should now be able to run the original docker run command:

docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
       -h $HOSTNAME -v $HOME/.Xauthority:/home/hakon/.Xauthority gui-test-ubuntu-2004

Type xhost + local:docker before running docker.