Xt错误:如果使用默认的DISPLAY

时间:2016-06-15 04:21:57

标签: macos docker x11 x11-forwarding xquartz

概述

我试图让XQuartz在OSX上工作,所以我可以通过Docker进行X11转发。我跟随the instructions here。我相信我的问题可以仅通过第一部分来回答,但为了以防万一(为了避免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

但伪文件存在:

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

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

bash-3.2$ echo $DISPLAY
:0

此值也适用于常规OSX:

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

以下不起作用,不确定为什么基于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

请注意,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

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

使用socat转发Docker

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

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

从另一个窗口运行它:

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

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

我无法使用有效的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

现在,这不是UNIX-CLIENT IP。但是,我不知道 DISPLAY=:0正在连接的内容。它确实不是6000端口,因为那是它以前监听的端口。如果我将其更改为6005,转发到6000,并使Docker容器显示为$(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

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

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

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
  • 别忘了关闭注销并重新登录。

1。关闭任何6000

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

$ lsof -i TCP:6000
$

如果有什么,只需终止进程

2。关闭任何6000

打开该端口上的套接字,并使终端保持打开状态

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

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)

4。生成并运行简单的UI App

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

神奇之处在于使用了Docker中的变量。只需使用-e DISPLAY=docker.for.mac.host.internal:0就可以了,因为它将指向内部IP地址并将其提供给docker映像。前进港口将发挥其魔力。

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

enter image description here

我注意到,此时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)

5。获利并运行更多应用

$ 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

答案 2 :(得分:1)

我需要退出终端,然后重新启动它以使其正常工作。

答案 3 :(得分:0)

对于OS X 10.6.3及更高版本,按XQuartz 2.7.11 instructions

  

如果这是您第一次安装XQuartz,您可能希望注销并重新登录。这将更新您的DISPLAY环境变量以指向XQuartz.app而不是X11.app。如果您希望继续使用X11.app作为默认服务器(您仍然可以手动启动XQuartz.app),则需要使用{{3}禁用/Library/LaunchAgents/org.macosforge.xquartz.startx.plist }。

在我的macOS High Sierra上安装launchctl(1)后,退出我的Mac并再次登录就足以通过我的MacOS终端工作了。但是,您可以通过打开XQuartz终端应用程序( XQuartz>应用程序>终端)并从那里运行X应用程序来避免注销和登录。例如:

enter image description here

然后

bash-3.2$ xclock &