XQuartzをOSXで動作させようとしているので、Docker経由でX11転送を行うことができます。私は ここの指示 に従っています。私の質問は最初の部分だけで答えられると思いますが、念のため(XYの問題を避けるため)、2番目の部分も提供しました。
Homebrew、_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
_
ただし、疑似ファイルは存在します。
_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
_
IcanXQuartzを介してxtermを開きます。次に:
_bash-3.2$ echo $DISPLAY
:0
_
この値は、通常のOSXでも機能します。
_$ DISPLAY=:0 xterm
# opens xterm, waits for it to finish
$
_
次は動作しませんが、なぜ ここの答え に基づいているのか分かりません:
_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
_
いずれにしても、次に進むと、この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ではありません。しかし、私は知らないwhat_DISPLAY=:0
_が接続している。確かにポート6000ではありません。これは、ポート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
_
XQuartzを再インストールした後、再起動しませんでした。再起動しましたが、今では動作します。 :)。
ポート、IPなどの確認に依存しない、可能な限り単純なバージョンを取得するために、すべての苦労を乗り越えました...ここにあります。
XQuartz 2.7.11 (xorg-server 1.18.4)
docker version 18.06.1-ce
必ずXQuartzをインストールしてください
$ brew install socat
$ brew cask reinstall xquartz
新しい端末で、ポート6000で実行されているものがあるかどうかを確認します
$ lsof -i TCP:6000
$
何かがある場合は、プロセスを強制終了します
そのポートでソケットを開き、ターミナルを開いたままにします
$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
新しい端末で、開いているかどうかを確認します
$ 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 .
魔法はDockerの変数を使用して発生します。 -e DISPLAY=docker.for.mac.Host.internal:0
は、内部IPアドレスをポイントし、それをdockerイメージに提供するため、トリックを行いました。ポートフォワードは魔法をかけます。
$ docker run -e DISPLAY=docker.for.mac.Host.internal:0 eyes
この時点で、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)
$ 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
動作させるために、Terminalを終了してから再起動する必要がありました。
OS X 10.6.3以降の場合、 XQuartz 2.7.11命令 :
XQuartzを初めてインストールする場合は、ログアウトして再度ログインすることをお勧めします。これにより、DISPLAY環境変数がX11.appではなくXQuartz.appを指すように更新されます。 X11.appをデフォルトサーバーとして使用し続ける場合は(XQuartz.appを手動で起動できます)、 launchctl(1) 。
MacOS High Sierraに XQuartz 2.7.11 をインストールした後、MacOSターミナルを介して動作するには、Macからログアウトして再度ログインするだけで十分です。ただし、XQuartzターミナルアプリケーション(XQuartz>アプリケーション>ターミナル)を開いて、そこからXアプリケーションを実行することにより、ログアウトしてログインする必要を回避できます。 。例えば:
その後
bash-3.2$ xclock &