Xt错误:如果使用默认的DISPLAY,则无法打开显示

Cla*_*diu 13 x11 macos x11-forwarding docker xquartz

概观

我试图让XQuartz在OSX上工作,所以我可以通过Docker进行X11转发.我按照这里的说明操作.我相信我的问题可以仅通过第一部分来回答,但为了以防万一(为了避免XY问题),我也提供了第二部分.

安装

我已经通过自制软件安装了它brew cask install xquartz.然后我open -a XQuartz开始吧.

本地xterms

测试它,如果我尝试打开它xterm,它不起作用:

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

但是,伪文件存在:

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
Run Code Online (Sandbox Code Playgroud)

可以通过XQuartz打开一个xterm.然后:

bash-3.2$ echo $DISPLAY
:0
Run Code Online (Sandbox Code Playgroud)

此值也适用于常规OSX:

$ DISPLAY=:0 xterm
# opens xterm, waits for it to finish
$
Run Code Online (Sandbox Code Playgroud)

以下不起作用,不知道为什么基于这里的答案:

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
Run Code Online (Sandbox Code Playgroud)

请注意,xinit由于某种原因确实有效:

$ 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
Run Code Online (Sandbox Code Playgroud)

问题1:XQuartz实际上在听什么?


Docker转发与socat

无论如何,继续前进,此socat命令不起作用:

MacBook-Pro:opencv-gui csaftoiu$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
Run Code Online (Sandbox Code Playgroud)

从另一个窗口运行它:

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
Run Code Online (Sandbox Code Playgroud)

socat窗口我得到:

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
Run Code Online (Sandbox Code Playgroud)

我无法使用有效的DISPLAY变量:

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
Run Code Online (Sandbox Code Playgroud)

现在,这不是UNIX-CLIENT IP.但是,我不知道连接的是什么 DISPLAY=:0.它当然不是6000端口,因为它是以前用来监听的端口.如果我将其更改为6005,转发到6000Docker容器并使其成为DISPLAY $(ipconfig getifaddr en0):5,那么连接当然会被拒绝:

$ 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
Run Code Online (Sandbox Code Playgroud)

问题2:如何从这里开始?

Cla*_*diu 14

重新安装XQuartz后我没有重新启动.我重新启动了,现在它可以工作了.:).


Mar*_*les 10

Docker for Desktop MacOS 2018+中的Dockerized UI Apps

经历了所有的苦难,获得了可能不依赖于检查端口,ip等的最简单的版本……在这里。

  • 跑步版 XQuartz 2.7.11 (xorg-server 1.18.4)
  • Docker版本 docker version 18.06.1-ce

确保安装XQuartz

$ brew install socat
$ brew cask reinstall xquartz
Run Code Online (Sandbox Code Playgroud)
  • 不要忘记关闭注销并重新登录。

1.关闭任何6000

在新终端上,验证端口6000上是否正在运行任何设备

$ lsof -i TCP:6000
$
Run Code Online (Sandbox Code Playgroud)

如果有什么,就杀死进程

2.关闭任何6000

打开该端口上的插座,并使终端保持打开状态

$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
Run Code Online (Sandbox Code Playgroud)

3.确认6000已打开

在新的终端中,验证它是否已打开

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

4.构建并运行简单的UI App

$ cat Dockerfile.eyes
FROM centos
RUN yum install -y xeyes
CMD ["/usr/bin/xeyes"]
$ docker build -t eyes -f Dockerfile.eyes .
Run Code Online (Sandbox Code Playgroud)

神奇的事情是使用Docker中的变量进行的。只是使用了-e DISPLAY=docker.for.mac.host.internal:0技巧,因为它将指向内部IP地址并将其提供给docker映像。前进港口将发挥其魔力。

$ docker run -e DISPLAY=docker.for.mac.host.internal:0 eyes
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我注意到,此时XQuartz单独打开到同一端口

$ 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)
Run Code Online (Sandbox Code Playgroud)

5.获利并运行更多应用

$ docker run -e DISPLAY=docker.for.mac.host.internal:0 jess/tor-browser
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

$ docker run -e DISPLAY=docker.for.mac.host.internal:0 batmat/docker-eclipse
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明