18

概要

Docker経由でX11転送を実行できるように、XQuartzをOSXで動作させようとしています。ここの指示に従っています。私の質問は最初の部分だけで答えられると思いますが、念のため (XY 問題を回避するために) 2 番目の部分も提供しました。

インストール

を介して、自作でインストールしましたbrew cask install xquartz。それから私はそれopen -a XQuartzを始めます。

ローカル xterm

テストして、を開こうとすると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
$

以下は機能しませんが、ここの回答に基づいている理由はわかりません:

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 コンテナーを 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

質問 2: ここから先はどうすればよいですか?

4

5 に答える 5

23

XQuartz を再インストールした後、再起動していませんでした。再起動したところ、動作するようになりました。:)。

于 2016-06-15T04:38:39.590 に答える
15

Docker for Desktop MacOS 2018+ で Docker 化された UI アプリ。2021 年に更新されました。

ポート、IPなどのチェックに依存しない、可能な限り最も単純なバージョンを取得するために、すべての苦労を経験しました...ここにあります。

  • 実行中のバージョンXQuartz 2.7.11 (xorg-server 1.18.4)
  • Docker のバージョンdocker version 18.06.1-ce

2021 changeXQuartz (Updated with )を必ずインストールしてください

$ brew install socat
$ brew install --cask xquartz
  • ログアウトを閉じて再度ログインすることを忘れないでください。

注意: この時点で、必ずホスト (MacOS など) を再起動してください。次のエラーは、そうでない場合に関連しています。E connect(5, LEN=2 AF=1 "<anon>", 2): Invalid argument

$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
2021/04/04 17:28:58 socat[40606] E connect(5, LEN=2 AF=1 "<anon>", 2): Invalid argument

指示

  • 2 つのターミナルを開く必要があります。1 つはディスプレイを備えた socat 用で、もう 1 つは UI コンテナーを実行するためです。

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 marcellodesales    5u  IPv4 0xe21e43ca9d99bf1d      0t0  TCP *:6000 (LISTEN)

4. シンプルな UI アプリをビルドして実行する

$ cat Dockerfile.eyes

FROM debian:latest
RUN apt-get update && apt-get install -y x11-apps
RUN rm -rf /tmp/* /usr/share/doc/* /usr/share/info/* /var/tmp/*
RUN useradd -ms /bin/bash user
ENV DISPLAY :0
USER user
ENTRYPOINT ["/bin/sh", "-c", "$0 \"$@\"", "xeyes"]

$ docker build -t eyes -f Dockerfile.eyes .

Docker の変数を使用すると、魔法が起こります。-e DISPLAY=docker.for.mac.host.internal:0内部IPアドレスを指し、それをdockerイメージに提供するため、を使用するだけでうまくいきました。ポート転送はその魔法を行います。

$ docker run -ti --rm -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 marcellodesales    5u  IPv4 0xe21e43ca9d99bf1d      0t0  TCP *:6000 (LISTEN)
X11.bin 29462 marcellodesales    8u  IPv6 0xe21e43ca7cdb1135      0t0  TCP *:6000 (LISTEN)

5. 利益を上げ、より多くのアプリを実行する

$ 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

ここに画像の説明を入力

于 2018-11-29T21:55:23.233 に答える