docker - 构建一个可以使用 LLVM 编译 ROS 项目的 docker 镜像

标签 docker llvm ros

我打算构建一个可以使用 LLVM 编译 ROS 项目代码的 Docker 镜像。根据Docker官方文档https://docs.docker.com/config/containers/multi-service_container/最好避免在一个容器中使用多个服务。 LLVM 和 ROS 都有自己的 Docker Image,如何将这两者合二为一并一起发布呢?

最佳答案

更新(2019.12.13):

如果你想做的一切使用clang在官方 ROS docker 镜像中,您可以执行以下操作:

FROM ros:melodic
RUN apt-get -y install clang-6.0
RUN update-alternatives --install /usr/bin/c++ c++ $(command -v clang++-6.0) 1000
RUN update-alternatives --install /usr/bin/cc  cc  $(command -v clang-6.0)   1000

您可以这样做,因为官方 ROS 镜像继承自使用 update-alternatives 的 Ubuntu 镜像。管理通用命令(例如 C/C++ 编译器)如何映射到提供它们的包。简而言之,对 update-alternatives 的调用将安装各种符号链接(symbolic link),例如 /usr/bin/cc/usr/bin/c++两者(最终)都指向clang-6.0clang++-6.0 , 分别。

详细了解如何update-alternatives作品,引用其man page .

原始答案如下。

您可以使用一些策略:

结合Dockerfile s

如果您可以同时访问 Dockerfile s,然后尝试将其中的内容合并为一个Dockerfile .您必须选择一个 FROM指令,但可以按照您选择的方式组合其他指令。

更改FROM在一个

如果您只能访问一个 Dockerfile ,然后尝试更改其FROM从另一个图像继承的指令。例如,ros:kinetic-ros-core-xenial图片继承自 ubuntu:xenial ;尝试将其更改为继承自,例如 reaverproject/llvm .
ADD两个压缩包

如果您无权访问 Dockerfile ,那么您将不得不进行一些逆向工程。首先从每个图像和 export 创建一个“noop”容器。从中获取文件系统压缩包。即,做...
$ docker container run --name noop-foobar foobar sh -c 'exit 0'
$ docker container export --output foobar.tar noop-foobar
$ docker container rm noop-foobar

...根据需要替换“foobar”。

导出两个文件系统 tarball 后,通过 ADD 创建一个“基础镜像”将它们发送到 scratch图片:
FROM scratch
ADD llvm.tar
ADD ros.tar
...

您很可能必须手动解决文件系统 tarball 之间的冲突,以使基础镜像按预期工作。

引用:
  • https://docs.docker.com/engine/reference/builder/
  • https://hub.docker.com/_/ros
  • https://docs.docker.com/engine/reference/commandline/container_export/
  • https://docs.docker.com/develop/develop-images/baseimages/#create-a-simple-parent-image-using-scratch
  • 关于docker - 构建一个可以使用 LLVM 编译 ROS 项目的 docker 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53950726/

    相关文章:

    linux - 在 docker 中找不到 sqlplus

    gcc - 使用gcc 4.6在内核3.0上编译LLVM 2.9的gcc 4.2

    c++ - CXXRecords getNameAsString,如何获取全名?

    c++ - ROS 节点到节点持续时间

    c++ - 执行 'cv::flip(img, img, 1)' 的替代方法

    docker - 为什么Docker入口点脚本无法启动?

    docker - 如何使用命名卷将数据从主机共享到容器?

    c++ - 在 CMake 项目中编译后添加自定义 llvm 优化命令 (opt)

    c++ - 使用 trajectory_msgs 在 gazebo 和 Controller 之间发布

    python - gitlab ci 中的 trufflehog