我有一个如下编写的Dockerfile:
FROM joesan/raspi_opencv_3:latest
RUN apt-get update
RUN sudo apt-get install --no-install-recommends xserver-xorg
RUN sudo apt-get install --no-install-recommends xinit
RUN apt-get install -qqy x11-apps
RUN mkdir -p /raspi_motion_detection/project
WORKDIR /raspi_motion_detection/project
COPY ./ $WORKDIR/
COPY ./requirements.txt $WORKDIR/
ADD . $WORKDIR
CMD xclock
我有一个Raspberry Pi,可以从Mac(运行High Sierra)中切换到该Raspberry Pi。
这是我的工作:
docker run -ti --device=/dev/vcsm \ --device=/dev/vchiq \ -e DISPLAY=$DISPLAY:0 \ -e XAUTHORITY=/.Xauthority \ -v /tmp/.X11-unix:/tmp/.X11-unix \ joesan/motion_detector
我收到如下错误消息:
错误:无法打开显示:localhost:11.0:0
但是当我直接在ssh终端上运行xclock时,我看到xclock窗口打开了。
所以我不明白为什么从Docker容器中运行xclock会阻止显示端口打开?有什么原因吗?我也在这里碰到过这篇文章,并按照那里的描述进行操作,但是我无法使它正常工作!
https://medium.com/@dimitris.kapanidis/running-gui-apps-in-docker-containers-3bd25efa862a
答案 0 :(得分:0)
有点简化:每个docker容器都在docker守护程序内部运行,该守护程序基本上为每个容器提供了一个简化的操作系统。那个操作系统没有窗口管理器。
这就是为什么Docker容器内的命令xclock
退出并显示错误。
当您通过ssh连接到树莓派并调用xclock
时,它将在树莓派的os(可能是树莓派)操作系统中执行,该操作系统具有运行中的窗口管理器。
答案 1 :(得分:0)
好!所以我想我找到了解决问题的方法!这就是我所做的!
在我的SD卡上重新安装了Raspberry Stretch Lite。旧的文件似乎已经过时了!您可以跳过此步骤,但是对我而言,旧安装中存在一些损坏的文件,因此我决定进行全新安装!
在我的Raspberry Pi上,运行以下命令:
xauth列表
我以后将cookie本地复制到文本编辑器中!
从我最初拥有的Dockerfile中删除了xclock命令!
使用以下命令构建Dockerfile:
docker run -it --net = host --device = / dev / vcsm --device = / dev / vchiq -e 显示-v /tmp/.X11-unix joesan / motion_detector bash
请注意,我正在对Docker运行一个bash命令,以便可以从正在运行的映像中获得basj提示!
第3步的结果会从我刚刚在第3步运行的容器中给我一个bash提示
我现在需要在映像中安装xauth
apt-get install xauth
是在这次爆炸之后!我得到了我想要的东西!