X11

作為 Docker 容器執行時出現 X11 錯誤

  • May 10, 2021

我正在嘗試從 Docker 容器執行一個應用程序,該容器應該打開一個 GUI 寡婦(在我的情況下是一個影片流)。Docker 容器在 Raspberry Pi 上執行,我從 Mac SSH 到 Pi,然後發出 Docker 執行命令。我這裡有一個問題:

當我按如下方式執行整個過程時,它可以完美執行:

我將命令執行為:

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

在發出 Docker 執行命令後打開的 bash 中,我安裝 xauth

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

然後我使用 Xauth add 添加 Xauth cookie,然後執行我的 Python 程序,它顯示帶有影片流的 GUI 視窗!

到現在為止還挺好。但是,每次我都不想再重複這些步驟。所以我寫了一個小腳本來做到這一點,如下所示:

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

有什麼我想念的嗎?

apt-get install xauth命令應該只需要一次,因此您可以將其包含在 Dockerfile 中,以便在建構映像時執行它。

RUN apt-get install xauth

對於該xauth add命令,您似乎依賴於 DISPLAY 變數,該變數在啟動時傳遞給容器。在這種情況下,最好創建一個 shell 腳本來執行您在啟動時需要的所有初始化,然後啟動您的 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"]

引用自:https://unix.stackexchange.com/questions/481532