Cla*_*diu 13 x11 macos x11-forwarding docker xquartz
我试图让XQuartz在OSX上工作,所以我可以通过Docker进行X11转发.我按照这里的说明操作.我相信我的问题可以仅通过第一部分来回答,但为了以防万一(为了避免XY问题),我也提供了第二部分.
我已经通过自制软件安装了它brew cask install xquartz
.然后我open -a XQuartz
开始吧.
测试它,如果我尝试打开它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)
无论如何,继续前进,此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
,转发到6000
Docker容器并使其成为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)
Mar*_*les 10
经历了所有的苦难,获得了可能不依赖于检查端口,ip等的最简单的版本……在这里。
XQuartz 2.7.11 (xorg-server 1.18.4)
docker version 18.06.1-ce
确保安装XQuartz
$ brew install socat
$ brew cask reinstall xquartz
Run Code Online (Sandbox Code Playgroud)
在新终端上,验证端口6000上是否正在运行任何设备
$ lsof -i TCP:6000
$
Run Code Online (Sandbox Code Playgroud)
如果有什么,就杀死进程
打开该端口上的插座,并使终端保持打开状态
$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
Run Code Online (Sandbox Code Playgroud)
在新的终端中,验证它是否已打开
$ 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)
$ 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)
$ 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)
归档时间: |
|
查看次数: |
17875 次 |
最近记录: |