AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 481532
Accepted
joesan
joesan
Asked: 2018-11-14 09:27:28 +0800 CST2018-11-14 09:27:28 +0800 CST 2018-11-14 09:27:28 +0800 CST

作为 Docker 容器运行时出现 X11 错误

  • 772

我正在尝试从 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

有什么我想念的吗?

docker x11
  • 2 2 个回答
  • 7983 Views

2 个回答

  • Voted
  1. Best Answer
    Haxiel
    2018-11-15T01:11:34+08:002018-11-15T01:11:34+08:00

    该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
  2. Romain
    2021-05-11T15:21:06+08:002021-05-11T15:21:06+08:00

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

    xhost +
    

    之后,我能够运行我的容器:

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

    我没有安装xauth在容器内。

    • 2

相关问题

  • xrdb 冒号丢失错误

  • 在不改变分辨率的情况下让事情变得更大?[伴侣]

  • SSH X11 转发仅在使用受信任时有效

  • 如何在 RHEL 7 上离线安装 docker?

  • 我只需要运行这个脚本文件一次吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve