我正在尝试从 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 中,以便在构建映像时执行它。对于该
xauth add
命令,您似乎依赖于 DISPLAY 变量,该变量在启动时传递给容器。在这种情况下,最好创建一个 shell 脚本来执行您在启动时需要的所有初始化,然后启动您的 Python 程序。例如:然后,您可以在构建阶段复制此脚本并将其设置为您的命令或入口点。
在运行容器之前,我通过在主机上使用此命令解决了这个问题:
之后,我能够运行我的容器:
我没有安装
xauth
在容器内。