我打算构建一个可以使用 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.0
和 clang++-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 之间的冲突,以使基础镜像按预期工作。
引用:
关于docker - 构建一个可以使用 LLVM 编译 ROS 项目的 docker 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53950726/