在主机网络模式下使用GUI应用程序运行docker容器时出现问题



我正在尝试创建一个带有ROS安装和模拟设置的docker容器,以简化稍后加入项目的人员的流程。

当我以这种方式运行rviz时,我会很好地在主机上显示rviz窗口,正如本ros教程所预期的那样:sudo docker run -it --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" xrf-robot-repo rviz

ROS Master未运行,因此此输出预期为

现在我的问题是,我想在主机网络模式下运行我的容器(--net=host),rviz对话不再显示。以下是我运行的内容:sudo docker run -it --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --net=host xrf-robot-repo rviz我认为这些错误与gui窗口没有显示无关

我不知道为什么GUI窗口没有显示。我希望在这里得到一些指导。我想这可能与不同的网络模式影响x11转发的工作方式有关,但我不确定如何进一步研究这一点。

以下是我用来构建图像的Dockerfile的样子,以防它可能有所帮助:

FROM osrf/ros:melodic-desktop-full  
SHELL ["/bin/bash", "-c"] 
RUN apt-get update && apt-get install -y --no-install-recommends 
git apt-utils  python3-catkin-tools
&& rm -rf /var/lib/apt/lists/*
RUN source ./ros_entrypoint.sh &&  git clone https://github.com/RumailM/xrf-robot-stack 
RUN source ./ros_entrypoint.sh && cd xrf-robot-stack && catkin_init_workspace
RUN apt-get update 
ARG DEBIAN_FRONTEND=noninteractive
RUN source ./ros_entrypoint.sh && cd xrf-robot-stack && rosdep install
--from-paths src --ignore-src -r -y
RUN source ./ros_entrypoint.sh && cd xrf-robot-stack && catkin build

我需要使用网络模式的原因是,我希望主机能够与rosmaster节点和容器中的任何其他节点进行通信。我也不知道容器外可能存在哪些节点,以及它们可以在哪些端口上进行通信,所以只转发我将使用的端口的明显答案是行不通的(端口可能在运行时发生变化)。运送大范围的港口似乎也不可行。

感谢您的指导!

您应该将--privileged选项添加到docker run命令中。这与Qt应用程序和网络主机这个问题有关。我遇到了一个类似的问题,并通过在ROS Answers上关注这个问题得以解决。

为了能够正确运行rviz,我需要docker容器来访问我的显卡驱动程序(NVIDIA)。因此,我需要将-e NVIDIA_VISIBLE_DEVICES=all-e NVIDIA_DRIVER_CAPABILITIES=all--runtime nvidia添加到docker run命令中。

这是的最终运行命令

docker run -it --rm 
--privileged 
--network host 
-e NVIDIA_VISIBLE_DEVICES=all 
-e NVIDIA_DRIVER_CAPABILITIES=all 
--env="DISPLAY" 
--env="QT_X11_NO_MITSHM=1" 
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" 
--name "$CONTAINER_NAME" 
--runtime nvidia 
xrf-robot-repo 
/bin/bash

希望这能帮助