X11
作為 Docker 容器執行時出現 X11 錯誤
我正在嘗試從 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"]