9

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
  • Does this answer your question? Is it possible to run Docker container and show its graphical application window on host?
    – N0rbert
    Commented Jun 11, 2020 at 8:14
  • @N0rbert Thanks for the link! It still does not work with --user 1000:1000. I tried this command: docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY --user 1000:1000 gui-test-ubuntu-2004. Still the same error message: Error: Can't open display: :0 Commented Jun 11, 2020 at 8:27
  • Try to simply repeat commands from my Q&A then adapt yours. The 1000 is not really constant, it is value of id -u and id -g (user and group identifiers).
    – N0rbert
    Commented Jun 11, 2020 at 8:28
  • 1
    Snap may be a reason, I have installed it as docker.io package from default repositories. Then added my user to the docker group.
    – N0rbert
    Commented Jun 11, 2020 at 10:40
  • 1
    Yes, I think that snap might be the issue here, see this issue: "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" Commented Jun 11, 2020 at 10:47

3 Answers 3

7

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
2
  • For me this was not the answer, I simply ran xhost + local:docker first and it worked. Not sure how much of a security risk this is?
    – Dan Bolser
    Commented Nov 16, 2021 at 12:53
  • Thank you! Installing via snap was indeed the problem. I simply removed the snap and installed via apt.
    – Alqio
    Commented Jan 12, 2023 at 9:11
6

Type xhost + local:docker before running docker.

3
  • 2
    xhost + is (almost) always a bad idea™
    – guntbert
    Commented Dec 28, 2020 at 21:27
  • 1
    On a home LAN, how is it ever a bad idea? Commented Nov 9, 2021 at 22:19
  • qt.qpa.screen: QXcbConnection: Could not connect to display Could not connect to any X display.
    – Owl
    Commented May 10, 2023 at 22:38
1

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: https://docs.docker.com/engine/install/ubuntu/

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .