Python Tkinter in Docker .TclError: couldn't connect to display

19,116

Solution 1

As described here, you would need an X11 graphic layer.
But since you are already on an '(X)Ubuntu, setting the DISPLAY should be enough:

export DISPLAY=127.0.0.1:0.0

docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix yourImage

Check also XAuthority.

Solution 2

You'll have to set DISPLAY in the container. You can add it as an argument to the docker run command like this:

docker run -ti -e DISPLAY=$DISPLAY blah-image blah-command

DISPLAY should be set in the Xubuntu shell you are running the command from.

Solution 3

Type xhost + in your terminal. Then

docker run --rm \
    --network=host --privileged \
    -v /dev:/dev \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v $HOME/.Xauthority:/root/.Xauthority \
    -it yourimage

worked for me. xhost + disables access control. After which a client can connect from any host.

Share:
19,116
Admin
Author by

Admin

Updated on June 14, 2022

Comments

  • Admin
    Admin almost 2 years

    I am new to python and am trying to build a small app. It needs to be a GUI app and I was wanting to containerise it with docker. I am getting the following error and can not find a solution

    No protocol specified
    No protocol specified
    Traceback (most recent call last):
      File "tkinker.py", line 7, in <module>
        tinker = Tk()
      File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1818, in __init__
        self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
    _tkinter.TclError: couldn't connect to display ":0.0"
    

    It starts locally but wont start in docker. My OS is Xubuntu.

    I have created a sample app (below), see run-test.sh https://github.com/jeremysells/test/tree/master/docker-tkinter

  • Admin
    Admin over 7 years
    Saidly same issue # docker run -ti -e DISPLAY=$DISPLAY tkinter-test:latest Traceback (most recent call last): File "tkinker.py", line 7, in <module> tinker = Tk() File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1818, in init self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) _tkinter.TclError: couldn't connect to display ":0.0"
  • VonC
    VonC over 7 years
    See also github.com/docker/docker/issues/8710#issuecomment-71113263 to expose local xquartz socket on a TCP port.
  • SidJ
    SidJ over 7 years
    Is display set in the shell where you start the command? Are you able to run GUIs from outside of docker?
  • Admin
    Admin over 7 years
    Yes the display is enabled. When I run #echo $DISPLAY it returns ":0.0". I wonder if it has something to do with xauth (stackoverflow.com/questions/16296753/… and wiki.ros.org/docker/Tutorials/GUI). I don't have any free time at the moment, so will have to get back to testing this when I do
  • Dan Anderson
    Dan Anderson over 4 years
    Use the IP address of your Linux/UNIX system (not the Docker container). For example, -e DISPLAY=10.0.0.1:0.0 (replace 10.0.0.1 with the IP address of your Linux/UNIX system).
  • David Maze
    David Maze over 4 years
    "Connect" here implies being able to run things like screen captures and keystroke loggers: you really don't want to allow this ability "from any host".
  • RayLuo
    RayLuo over 3 years
    So, what is the better alternative, @DavidMaze ?