Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从XRDP客户端在docker容器中运行GUI应用程序_Docker_Opencv - Fatal编程技术网

从XRDP客户端在docker容器中运行GUI应用程序

从XRDP客户端在docker容器中运行GUI应用程序,docker,opencv,Docker,Opencv,我有两台机器, 机器A:system ubuntu 20.04(显示:0) 机器B:系统windows 10 在机器A中,我使用以下命令创建docker容器: docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -v $(pwd):/home/walid/notebooks opencv bash walid@admins:~$ sudo docker exec -it -e DISPLAY=$DIS

我有两台机器, 机器A:system ubuntu 20.04(显示:0) 机器B:系统windows 10

在机器A中,我使用以下命令创建docker容器:

docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -v $(pwd):/home/walid/notebooks opencv bash
walid@admins:~$ sudo docker exec -it -e DISPLAY=$DISPLAY open bash
docker容器安装了Visual Studio代码和OpenCV,我在容器bash中运行以下命令:

docker exec -it $containerId bash
在容器内,我进入笔记本文件夹并运行以下命令:

code . # to launch the visual studio code
结果;VisualStudio代码将打开

python read.py # to open a video capture with OpenCV
结果;好,视频捕获打开

现在打开机器B;我使用
远程桌面连接
连接到机器B,当我进入容器打开Visual Studio code时,什么都没有打开,当我尝试
python read.py
时,我得到一个错误
无法连接到显示器:10.0

我知道我哪里做错了:

(base) adminsst@admins:~$ xhost
access control enabled, only authorized clients can connect
SI:localuser:adminsst
(base) adminsst@admins:~$ sudo su
root@admins:/home/adminsst# xhost
No protocol specified
xhost:  unable to open display ":10.0"
当我在
sudo su
中运行容器时,它不工作,但当我
sudo docker运行时……
它工作

但是现在,当我登录到服务器中的另一个用户(机器A)并执行同样的操作时,我认为它不再工作,我将得到相同的错误
无法连接到display:11.0

解决方案1 以下是我所做的解决方案,它对我很有效: 首先,如果在新用户中运行以下命令,您将获得:

walid@admins:~$ xhost
access control enabled, only authorized clients can connect
现在再次运行this one以获得以下结果:

walid@admins:~$ xhost +local:
non-network local connections being added to access control list
要启动GUI应用程序,您需要将新显示传递给容器,因为每次登录时都会更改该显示以解决此问题,只需运行以下命令:

docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -v $(pwd):/home/walid/notebooks opencv bash
walid@admins:~$ sudo docker exec -it -e DISPLAY=$DISPLAY open bash
现在您可以毫无问题地启动GUI应用程序了,但每次登录时,您都应该在启动容器之前执行以下命令
xhost+local:
,如果有人对此有解决方案,请告诉我

解决方案2 请参阅以下url

还有更多有用的解决方案

-------- 我面临的另一件事是,即使我执行上述步骤,有时也不起作用,我只需通过以下操作将docker容器中的显示ID更改为与本地机器ID相同的ID:

首先通过以下方式计算出本地机器显示ID
echo$DISPLAY
然后在docker容器中执行以下操作
$DISPLAY=:ID

Windows远程桌面与Linux x-server不同。您需要在Windows上安装x-server。也许这有帮助