Dockerコンテナとして実行するとX11エラー

Dockerコンテナとして実行するとX11エラー

GUIウィンドウ(私の場合はビデオストリーム)を開く必要があるDockerコンテナでアプリケーションを実行しようとしています。 DockerコンテナはRaspberry Piで実行されており、MacではPiにSSHとして接続し、Docker実行コマンドを実行します。ここに質問があります。

次のようにプロセス全体を実行すると、完全に機能します。

次のようにコマンドを実行します。

docker run -it --net=host --device=/dev/vcsm --device=/dev/vchiq -e DISPLAY -v /tmp/.X11-unix joesan/motion_detector bash

Docker runコマンドを実行した後、開いたbashからxauthをインストールします。

root@cctv:/raspi_motion_detection/project# apt-get install xauth

次に、Xauth addを使用してXauth Cookieを追加し、ビデオストリームでGUIウィンドウを表示するPythonプログラムを実行します。

今まではそんなに良くなった。しかし、毎回このステップをやり直したくありません。だから私はこれのために次のような小さなスクリプトを書いています。

HOST=cctv

DISPLAY_NUMBER=$(echo $DISPLAY | cut -d. -f1 | cut -d: -f2)
echo $DISPLAY_NUMBER

# Extract auth cookie
AUTH_COOKIE=$(xauth list | grep "^$(hostname)/unix:${DISPLAY_NUMBER} " | awk '{print $3}')

# Add the xauth cookie to xauth
xauth add ${HOST}/unix:${DISPLAY_NUMBER} MIT-MAGIC-COOKIE-1 ${AUTH_COOKIE}

# Launch the container  
docker run -it --net=host --device=/dev/vcsm --device=/dev/vchiq -e DISPLAY -v /tmp/.X11-unix  joesan/motion_detector`

ただし、今回は次のエラーで失敗します。

X11 connection rejected because of wrong authentication.
Unable to init server: Could not connect: Connection refused

その後、上記のスクリプトをsudoユーザーとして実行し、次のような結果を得ました。

xauth:  file /root/.Xauthority does not exist
xauth: (argv):1:  bad "add" command line
X11 connection rejected because of wrong authentication.
Unable to init server: Could not connect: Connection refused

私が逃したものはありますか?

ベストアンサー1

このapt-get install xauthコマンドは一度だけ必要なので、Dockerfileに含めてイメージをビルドするときに実行できます。

RUN apt-get install xauth

そのxauth addコマンドは、起動時にコンテナに渡されるDISPLAY変数に依存しているようです。この場合、起動時に必要なすべての初期化を実行し、Pythonプログラムを起動するシェルスクリプトを作成することをお勧めします。たとえば、

#!/bin/bash

HOST=cctv
DISPLAY_NUMBER=$(echo $DISPLAY | cut -d. -f1 | cut -d: -f2)
AUTH_COOKIE=$(xauth list | grep "^$(hostname)/unix:${DISPLAY_NUMBER} " | awk '{print $3}')
xauth add ${HOST}/unix:${DISPLAY_NUMBER} MIT-MAGIC-COOKIE-1 ${AUTH_COOKIE}
python /path/to/program.py

その後、ビルドフェーズでこのスクリプトをコピーしてコマンドまたはエントリポイントに設定できます。

COPY init-script.bash /opt/program
CMD ["/bin/bash","/opt/program/init-script.bash"]

おすすめ記事