我正在实现一个docker容器来编译(构建)我在C ++中的代码。我的代码支持的平台是Windows,Linux和Mac OSX。
我在Mac机器上使用clang来编译代码; Linux上的gcc和Windows上的Microsoft编译器(cl)。我的想法是创建一个Docker容器并在Windows机器本身(在docker容器内)执行构建(Linux和Mac)(以便我不必将代码推送到git;然后将它从我的Mac机器中拉出然后再构建等等。
我用来执行Mac版本的图像(因为我在Mac OSX上使用clang)是https://hub.docker.com/r/rsmmr/clang/。
我想在此图片中添加一个可执行文件,用于测试目的。它被称为'testapp'。
因此图像应该包含以下组件: 基础OS + Clang + testapp。
如何将我的可执行文件'testapp'(例如:application / utlity)添加到此图像'rsmmr / clang'(我从dockerhub中提取)?
我是否通过Dockerfile执行此操作(如何?)? 还有其他方法可以实现同样的目标吗?
答案 0 :(得分:0)
解决此问题的一个简单方法是将源/二进制测试应用程序安装到clang
图像。
为了证明这一点,我自己创建了一个testapp.cc,它看起来像这样:
[anovil@ubuntu-anovil add_application_docker_image]$ cat testapp.cc
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
[anovil@ubuntu-anovil add_application_docker_image]$
然后,通过将我的本地目录传递给容器并运行编译命令来启动rsmmr/clang
容器:
[anovil@ubuntu-anovil add_application_docker_image]$ docker run -v $(pwd):/mnt -it rsmmr/clang /opt/llvm/bin/clang++ --std=c++11 --stdlib=libc++ /mnt/testapp.cc -o /mnt/a.out
[anovil@ubuntu-anovil add_application_docker_image]$
在此之后,a.out
将位于您的本地目录中(因为它已安装到容器中)。
[anovil@ubuntu-anovil add_application_docker_image]$ ls
a.out testapp.cc
[anovil@ubuntu-anovil add_application_docker_image]$
如果要在容器内执行该二进制文件,也可以执行此操作。
[anovil@ubuntu-anovil add_application_docker_image]$ docker run -v $(pwd):/mnt -it rsmmr/clang /mnt/a.out
Hello World!
[anovil@ubuntu-anovil add_application_docker_image]$
你也可以和其他编译器做类似的事情。我没有Windows机器,但它应该工作:) 你想要这样的东西吗?
让我知道它是怎么回事。
谢谢,
答案 1 :(得分:0)
如果您愿意,可以通过创建自己的Dockerfile并制作自己的图像来实现这一目标。
使用
启动DockerfileFROM install-clang
然后添加你需要的东西。
COPY a.out directoryinthecontainer/
如果在创建图像时需要采取进一步措施,请使用
RUN apt-get morepackage && execute mycommand && unpack somefile.tar
您了解到:这些可以是您喜欢的任何操作系统命令。 如果您希望该应用程序作为新图像的核心部分运行,请添加
ENTRYPOINT ["directoryinthecontainer/a.out", "-myoptions"]
或
CMD ["directoryinthecontainer/a.out", "-myoptions"]
使用ENTRYPOINT,RUN或CMD时会有细微差别,这取决于您的使用案例。
请参阅Dockerfile Reference,了解哪一个可能符合您的要求。
编辑:我想我会澄清下一步:
使用Dockerfile使用
创建自己的图像docker build -t myrepo/myimage:mytag .
别忘了'。' (句点)在命令行的末尾!
从那时起,您可以使用自己的图像创建一个容器,该容器将执行原始CLANG加上您的其他功能。这是我最喜欢的功能之一! :)