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.
Je l'ai installé via homebrew, via brew cask install xquartz
. Ensuite, je open -a XQuartz
Pour le démarrer.
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
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
Je n'avais pas redémarré après avoir réinstallé XQuartz. J'ai redémarré, et maintenant ça marche. :).
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.
XQuartz 2.7.11 (xorg-server 1.18.4)
docker version 18.06.1-ce
Assurez-vous d'installer XQuartz
$ brew install socat
$ brew cask reinstall xquartz
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
Ouvrez une prise sur ce port et laissez le terminal ouvert
$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
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)
$ 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
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)
$ docker run -e DISPLAY=docker.for.mac.Host.internal:0 jess/tor-browser
$ docker run -e DISPLAY=docker.for.mac.Host.internal:0 batmat/docker-Eclipse
J'ai dû quitter Terminal puis le relancer pour le faire fonctionner.
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:
puis
bash-3.2$ xclock &