将您的应用程序添加到Docker镜像

时间:2016-04-25 06:03:48

标签: macos docker clang dockerfile docker-image

我正在实现一个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执行此操作(如何?)? 还有其他方法可以实现同样的目标吗?

2 个答案:

答案 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机器,但它应该工作:) 你想要这样的东西吗?

让我知道它是怎么回事。

谢谢,

  • Anoop

答案 1 :(得分:0)

如果您愿意,可以通过创建自己的Dockerfile并制作自己的图像来实现这一目标。

使用

启动Dockerfile
FROM 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加上您的其他功能。这是我最喜欢的功能之一! :)