在 Docker 容器启动时启动 "roscore" 然后 "rosrun ...." 的最佳做法是什么?

What is the best practice to start "roscore" followed by "rosrun ...." on Docker Container startup?

我通过 Docker 文件创建了一个 Docker 图像,其中正确安装了 Ubuntu 18.04 和 ROS Melodic。请注意,我没有使用 official ROS-Docker image 创建我的 Docker 图像。

从这个 Docker 图像派生的 Docker 容器工作正常。 但是,每次我想使用容器时,我都需要执行以下命令:

  1. 航站楼 window:

docker run -d -it --name container_name docker_image; docker exec -it container_name bash

然后,在我进入 Docker 容器之后: roscore

  1. 航站楼 window:

docker exec -it container_name bash

然后,在我进入 Docker 容器之后: rosrun ROS_PackageName PythonScript.py

请注意,通过上述Docker命令,两个终端在相同 Docker容器中运行。

我发现我的启动方式 PythonScript.py 效率低下。 因此,我想寻求最佳实践,在 Docker 容器启动时启动“roscore”,然后启动“rosrun ....”。

在某些 Docker 文件中,我在文件末尾看到命令 ENTRYPOINT 以及 CMD。 但是,我不知道这些命令是否可以帮助我让我的 Docker 容器在容器启动时先执行“roscore”,然后再执行“rosrun”。

这实际上是 roslaunch 的部分用途。它使启动多个节点和更好的参数输入变得更容易,但它会 也会 启动一个 roscore 是一个尚未 运行。在您的示例中,它看起来像这样:

<launch>
  <node pkg="ROS_PackageName" type="PythonScript.py" name="my_node_name" output="screen" >
  </node>
</launch>

当通过 CLI 运行 roslaunch 时,您可以像 rosrun 一样使用它。例如,如果您在列出的同一个示例包中创建启动文件并将文件命名为 my_launch.launch,命令将如下所示:roslaunch ROS_PackageName my_launch.launch。只需用这个替换上面的 rosrun 命令。