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?

13

3 Answers

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 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
1

Type xhost + local:docker before running docker.

2

I was testing this but it was raising the error.standard_init_linux.go:228: exec user process caused: exec format error

My docker was installed following the instructions here:

I added the the #!/bin/bash on the first line of your entrypoint.sh and it's working for me.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like