作为 Docker 容器运行时出现 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 run 命令后打开的 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

我有什么遗漏的吗?

答案1

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"]

答案2

在运行容器之前,我通过在主机上使用以下命令解决了这个问题:

xhost +

之后,我可以使用以下命令运行我的容器:

sudo docker run -it --device=/dev/video0:/dev/video0 -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix test1

我没有安装xauth在容器内。

相关内容