web-dev-qa-db-fra.com

Erreur Xt: impossible d'ouvrir l'affichage, si vous utilisez l'affichage par défaut

Aperçu

J'essaie de faire fonctionner XQuartz sur OSX afin que je puisse faire le transfert X11 via Docker. Je suis les instructions ici . Je pense que ma première question ne pourra être résolue que par la première partie, mais au cas où (pour éviter le problème XY), j'ai également fourni la deuxième partie.

Installation

Je l'ai installé via homebrew, via brew cask install xquartz. Ensuite, je open -a XQuartz Pour le démarrer.

Xterms locaux

Le tester, si j'essaye d'ouvrir un xterm, ça ne marche pas:

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

Le pseudo-fichier existe cependant:

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

Je peux ouvrir un xterm via XQuartz. Ensuite:

bash-3.2$ echo $DISPLAY
:0

Cette valeur fonctionne également à partir d'un OSX standard:

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

Les éléments suivants ne fonctionnent pas cependant, je ne sais pas pourquoi en fonction de la réponse ici :

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

Notez que xinit fonctionne pour une raison quelconque:

$ 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: Qu'est-ce que XQuartz écoute réellement?


Docker Forwarding avec socat

Dans tous les cas, en continuant, cette commande socat ne fonctionne pas:

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

En exécutant cela, à partir d'une autre fenêtre, je fais:

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

De la fenêtre socat j'obtiens:

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

Je ne peux pas non plus utiliser la variable DISPLAY qui fonctionne:

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

Maintenant, ce n'est pas une IP UNIX-CLIENT. Mais, je ne sais pas à quoi DISPLAY=:0 Se connecte. Ce n'est certainement pas le port 6000 car c'est le port sur lequel il écoutait. Si je le change en 6005, Que je transfère en 6000, Et que le DISPLAY du Docker soit $(ipconfig getifaddr en0):5 à la place, alors la connexion est bien sûr refusée:

$ 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: Comment procéder à partir d'ici?

14
Claudiu

Je n'avais pas redémarré après avoir réinstallé XQuartz. J'ai redémarré, et maintenant ça marche. :).

13
Claudiu

Applications d'interface utilisateur Dockerized dans Docker pour ordinateur de bureau MacOS 2018+

Je suis passé par toute la peine pour obtenir la version la plus simple possible qui ne dépend pas de la vérification du port, de l'ip, etc. La voici.

  • Version en cours d'exécution XQuartz 2.7.11 (xorg-server 1.18.4)
  • Version Docker docker version 18.06.1-ce

Assurez-vous d'installer XQuartz

$ brew install socat
$ brew cask reinstall xquartz
  • N'oubliez pas de fermer la déconnexion et de vous reconnecter.

1. Fermez tout 6000

Sur un nouveau terminal, vérifiez s'il y a quelque chose en cours d'exécution sur le port 6000

$ lsof -i TCP:6000
$

S'il y a quelque chose, tuez simplement le processus

2. Fermez tout 6000

Ouvrez une prise sur ce port et laissez le terminal ouvert

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

3. Vérifiez que le 6000 est ouvert

Dans un nouveau terminal, vérifiez s'il est ouvert

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

4. Créez et exécutez une application d'interface utilisateur simple

$ cat Dockerfile.eyes
FROM centos
RUN yum install -y xeyes
CMD ["/usr/bin/xeyes"]
$ docker build -t eyes -f Dockerfile.eyes .

La magie opère à l'aide des variables de Docker. Il suffit d'utiliser le -e DISPLAY=docker.for.mac.Host.internal:0 a fait l'affaire, car il pointera vers l'adresse IP interne et la fournira à l'image du docker. Le port forward fera sa magie.

$ docker run -e DISPLAY=docker.for.mac.Host.internal:0 eyes

enter image description here

J'ai remarqué qu'à ce stade, XQuartz est ouvert sur le même port

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

5. Profitez et exécutez plus d'applications

$ 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

8
Marcello de Sales

J'ai dû quitter Terminal puis le relancer pour le faire fonctionner.

1
Stunner

Pour OS X 10.6.3 et versions ultérieures, par instructions XQuartz 2.7.11 :

Si c'est la première fois que vous installez XQuartz, vous pouvez vous déconnecter et vous reconnecter . Cela mettra à jour votre variable d'environnement DISPLAY pour pointer vers XQuartz.app plutôt que X11.app. Si vous préférez continuer à utiliser X11.app comme serveur par défaut (vous pouvez toujours lancer XQuartz.app manuellement), vous souhaiterez désactiver /Library/LaunchAgents/org.macosforge.xquartz.startx.plist à l'aide de launchctl (1) .

Après avoir installé XQuartz 2.7.11 sur mon macOS High Sierra, se déconnecter de mon Mac et se reconnecter était suffisant pour que cela fonctionne via mon terminal MacOS. Cependant, vous pouvez éviter d'avoir à vous déconnecter et à vous connecter en ouvrant l'application XQuartz Terminal ( XQuartz> Applications> Terminal ) et en exécutant votre application X à partir de là . Par exemple:

enter image description here

puis

bash-3.2$ xclock &
0
bigT