我有一个使用gstreamer插件来捕获摄像机输入的docker容器。使用Bastler相机可以正常运行,但是现在我需要使用IDS uEye相机。为了能够使用此相机,我需要运行ueyeusbdrc服务。 IDS文档说,要启动它,我可以运行sudo systemctl start ueyeusbdrc
或sudo /etc/init.d/ueyeusbdrc start
。问题是,当docker容器运行时,该服务未运行,并且出现无法初始化相机错误,这与在运行gst-launch-1.0 -v idsueyesrc ! videoconvert ! autovideosink
并且ueyeusbdrc服务未在外部运行时遇到的错误相同我PC中的容器。因此,这告诉我问题是ueyeusbdrc服务未在容器内运行。
我如何在Docker容器中运行ueyeusbdrc?我尝试在启动应用程序的.sh脚本中运行/etc/init.d/ueyeusbdrc start
(在Dockerfile中使用ENTRYPOINT ["<.sh file>"]
进行调用),但失败。另外,如果我尝试使用sudo,它会告诉我该命令不存在。如果我运行systemctl,它还会告诉我该命令不存在。顺便说一句,我正在使用privileged: true
运行docker(至少那是在docker-compose.yml文件中设置的)。
我正在使用Ubuntu 18.04。
更新:我将/ run / ueyed和/ var / run / ueyed映射到容器,并将错误从无法初始化摄像机更改为未能初始化视频捕获。可能是我可以在主机中运行守护程序,并且有一种方法可以将其挂接到容器。关于如何做到这一点的任何建议?
最后终于成功了。我必须在docker命令中添加一些选项(在本例中,是在docker-compose yml文件中)。我的解决方案基于此处的设置:https://github.com/chalmers-revere/opendlv-device-camera-ueye
向docker命令添加这些参数解决了问题:--ipc=host --pid=host -v /var/run:/var/run
。使用这些选项,无需在容器内运行服务。
另一个关键部分是将IDS软件安装在Docker容器内。可以通过下载,解压缩并运行安装程序来轻松完成此操作(上述git repo具有过时的版本,但是最新版本可以在IDS网页上找到)。
此外,请确保IDS uEye摄像机的系统服务正在主机(sudo systemctl start ueyeusbdrc
)中运行。