Xt error: Can't open display, if using default DISPLAY

35,428

Solution 1

I hadn't restarted after re-installing XQuartz. I restarted, and now it works. :).

Solution 2

Dockerized UI Apps in Docker for Desktop MacOS 2018+. Updated in in 2021.

Went through all the pain to get the simplest version possible that does not depend on checking port, ip, etc... Here it is.

  • Running version XQuartz 2.7.11 (xorg-server 1.18.4)
  • Docker version docker version 18.06.1-ce

Make sure to install XQuartz (Updated with 2021 change)

$ brew install socat
$ brew install --cask xquartz
  • Don't forget to close logout and log back in.

ATTENTION: At this point, make sure to reboot your host (MacOS for instance). The following error is related to when you don't: E connect(5, LEN=2 AF=1 "<anon>", 2): Invalid argument

$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
2021/04/04 17:28:58 socat[40606] E connect(5, LEN=2 AF=1 "<anon>", 2): Invalid argument

Instructions

  • You will need at 2 terminals open: one for the socat with the display and the other for running the UI container.

1. Close any 6000

On a new terminal, verify if there's anything running on port 6000

$ lsof -i TCP:6000
$

If there is anything, just kill the process

2. Close any 6000

Open a socket on that port and keep the terminal open

$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

3. Verify 6000 is open

In a new terminal, verify if it is opened

$ lsof -i TCP:6000
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
socat   29298 marcellodesales    5u  IPv4 0xe21e43ca9d99bf1d      0t0  TCP *:6000 (LISTEN)

4. Build and Run simple UI App

$ cat Dockerfile.eyes

FROM debian:latest
RUN apt-get update && apt-get install -y x11-apps
RUN rm -rf /tmp/* /usr/share/doc/* /usr/share/info/* /var/tmp/*
RUN useradd -ms /bin/bash user
ENV DISPLAY :0
USER user
ENTRYPOINT ["/bin/sh", "-c", "$0 \"$@\"", "xeyes"]

$ docker build -t eyes -f Dockerfile.eyes .

The magic happens using the variables from Docker. Just using the -e DISPLAY=docker.for.mac.host.internal:0 did the trick, as it it will point to the internal IP address and provide that to the docker image. The port forward will do its magic.

$ docker run -ti --rm -e DISPLAY=docker.for.mac.host.internal:0 eyes

enter image description here

I noticed that at this point XQuartz is opened on it own to the same port

$ lsof -i TCP:6000
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
socat   29298 marcellodesales    5u  IPv4 0xe21e43ca9d99bf1d      0t0  TCP *:6000 (LISTEN)
X11.bin 29462 marcellodesales    8u  IPv6 0xe21e43ca7cdb1135      0t0  TCP *:6000 (LISTEN)

5. Profit and run more apps

$ docker run -e DISPLAY=docker.for.mac.host.internal:0 jess/tor-browser

enter image description here

$ docker run -e DISPLAY=docker.for.mac.host.internal:0 batmat/docker-eclipse

enter image description here

Solution 3

I needed to quit Terminal and then relaunch it in order to get it to work.

Solution 4

For OS X 10.6.3 and later, per XQuartz 2.7.11 instructions:

If this is your first time installing XQuartz, you may wish to logout and log back in. This will update your DISPLAY environment variable to point to XQuartz.app rather than X11.app. If you would prefer to keep using X11.app as your default server (you can still launch XQuartz.app manually), you’ll want to disable /Library/LaunchAgents/org.macosforge.xquartz.startx.plist using launchctl(1).

After installing XQuartz 2.7.11 on my macOS High Sierra, logging out of my Mac and logging in again was enough for this to work via my MacOS Terminal. However, you may avoid having to logout and log in by opening the XQuartz Terminal application (XQuartz > Applications > Terminal), and running your X application from there. For example:

enter image description here

and then

bash-3.2$ xclock &
Share:
35,428

Related videos on Youtube

Claudiu
Author by

Claudiu

Graduated from Brown University. E-mail: [email protected]

Updated on September 23, 2021

Comments

  • Claudiu
    Claudiu over 2 years

    Overview

    I'm attempting to get XQuartz to work on OSX so I can do X11 forwarding via Docker. I'm following the instructions here. I believe my question may be answered by just the first part, but just in case (to avoid the XY problem), I've provided the second part as well.

    Installation

    I've installed it via homebrew, via brew cask install xquartz. Then I open -a XQuartz to start it.

    Local xterms

    Testing it out, if I try to open an xterm, it does not work:

    MacBook-Pro:opencv-gui csaftoiu$ xterm
    xterm: Xt error: Can't open display: /private/tmp/com.apple.launchd.3wncZULdXC/org.macosforge.xquartz:0
    

    The pseudo-file exists, though:

    MacBook-Pro:opencv-gui csaftoiu$ echo $DISPLAY
    /private/tmp/com.apple.launchd.3wncZULdXC/org.macosforge.xquartz:0
    MacBook-Pro:opencv-gui csaftoiu$ ls -alh $DISPLAY
    srw-rw-rw-  1 csaftoiu  wheel     0B May  6 21:12 /private/tmp/com.apple.launchd.3wncZULdXC/org.macosforge.xquartz:0
    

    I can open an xterm via XQuartz. Then:

    bash-3.2$ echo $DISPLAY
    :0
    

    This value works from a regular OSX too:

    $ DISPLAY=:0 xterm
    # opens xterm, waits for it to finish
    $
    

    The following do not work though, not sure why based on the answer here:

    xterm: Xt error: Can't open display: localhost:0
    MacBook-Pro:opencv-gui csaftoiu$ DISPLAY=127.0.0.1:0 xterm
    xterm: Xt error: Can't open display: 127.0.0.1:0
    MacBook-Pro:opencv-gui csaftoiu$ DISPLAY=`ipconfig getifaddr en0`:0 xterm
    xterm: Xt error: Can't open display: 192.168.1.15:0
    

    Note that xinit does work for some reason:

    $ xinit
    
    xinit: XFree86_VT property unexpectedly has 0 items instead of 1
    # opens xterm, waits for it to finish
    xinit: connection to X server lost
    
    waiting for X server to shut down
    

    Question 1: What is XQuartz actually listening on?


    Docker Forwarding with socat

    In any case, moving on, this socat command does not work:

    MacBook-Pro:opencv-gui csaftoiu$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
    

    Running that, from another window I do:

    MacBook-Pro:opencv-gui csaftoiu$ docker run --rm -it -e DISPLAY=`ipconfig getifaddr en0`:0 ubuntu:14.04 bash
    root@912eec31b8cb:/# apt-get update && apt-get install xterm
    ... such install, wow ...
    root@912eec31b8cb:/# xterm
    Warning: This program is an suid-root program or is being run by the root user.
    The full text of the error or warning message cannot be safely formatted
    in this environment. You may get a more descriptive message by running the
    program as a non-root user or by removing the suid bit on the executable.
    xterm: Xt error: Can't open display: %s
    root@912eec31b8cb:/# echo $DISPLAY
    192.168.1.15:0
    

    From the socat window I get:

    2016/06/14 21:08:15 socat[24289] E connect(5, LEN=68 AF=1 "/private/tmp/com.apple.launchd.3wncZULdXC/org.macosforge.xquartz:0", 68): Connection refused
    

    I can't use the DISPLAY variable that works, either:

    MacBook-Pro:opencv-gui csaftoiu$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\":0\"
    2016/06/14 21:09:43 socat[24309] E connect(5, LEN=4 AF=1 ":0", 4): No such file or directory
    

    Now, this is not a UNIX-CLIENT IP. But, I don't know what DISPLAY=:0 is connecting to. It's certainly not port 6000 since that's the port it used to be listening on. If I change it to 6005, to forward to 6000, and make the Docker container DISPLAY be $(ipconfig getifaddr en0):5 instead, then the connection is of course refused:

    $ socat TCP-LISTEN:6005,reuseaddr,fork TCP:localhost:6000
    2016/06/14 21:20:32 socat[25379] E connect(8, LEN=16 AF=2 127.0.0.1:6000, 16): Connection refused
    

    Question 2: How to proceed from here?

  • Jared Chmielecki
    Jared Chmielecki almost 7 years
    The instructions I was following did say to log out and back in for xQuarts to work, which I did. Rebooting was the key piece I was missing too, thanks!
  • Jeff Clayton
    Jeff Clayton almost 5 years
    The terminal needed to see the new path installed with X. You could add it on the command line but a relaunch of the terminal solves that easily.
  • Kristof
    Kristof almost 5 years
    This looked promising but the resulted GUI session is unstable (shuts down within 30 seconds without error message. I've read one could use the -t flag somewhere to somehow disable default timeout but there is little documentation on socat and adding the 't ignoreof' in the socat TCP-LISTEN' command certainly doesn't work (in fact socat continues to listen to port 6000 even after the graphical application is shut down). I also get libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast
  • Tom Chen
    Tom Chen over 3 years
    > If this is your first time installing XQuartz, you may wish to logout and log back in Thank you!!!!
  • Admin
    Admin over 2 years
    As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.