Docker C ++开发和CI

我想使用docker来dockerize我的C ++项目。 互联网有build议,最好使用2个容器 – 开发和产品。 但我不明白我需要如何创build一个开发容器来支持持续集成。

问题如下:

  • 如果是CI,那么应该在docker builddocker run上编译项目的时间?
  • 如果在docker build中,我如何从开发容器中获得编译后的项目放入产品容器? 因为在docker build阶段你不能连接VOLUMES。
  • 反正有没有在C ++开发中使用docker的食谱?

也许我根本没有正确的方向,例如,一个开发容器应该包括日食? 虽然那么CI呢? 我find的所有教程通常都是指PHP,它没有编译阶段。

Docker和C ++有不同的模式。

用准备好的Docker镜像编译项目

这包括使用您需要的编译器和第三方库(使用docker build创build )的docker镜像,并使用docker run命令编译您的项目。 这通常是处理CI环境最常用的方法。

优点:

  • 你可以你的项目文件夹挂载到容器中,让它完成工作。 最后,你的主机系统中有你的二进制文件。
  • 用于testing的图像可以与生产相同(取决于当然的项目)
  • Docker镜像较小(只要将代码保存在一个装入卷中)
  • 易于更新基本的图像和包(例如从Ubuntu 16.04到16.10等)

缺点:

  • 每个开发人员/ QA必须自行configurationdocker集装箱的启动(使用docker合成

在项目范围内构buildDocker映像

在这种情况下,您需要将所有需求和代码封装在Docker镜像中,这意味着您必须在每次更改代码时重新构build它,移除先前运行的容器,将新镜像下载到CI服务器等等。

优点:

  • 非常专业的图像 – 一个docker图像 – >您的代码的一个快照
  • 更快与QA分享

缺点:

  • 巨大的Docker图像
  • 每当代码发生变化时,都必须触发Docker构build ,这会运行编译等。 – >很慢
  • 更新/更多的图层更复杂

请记住,Docker有一定数量的最大允许的图层(我猜它仍然是127),图层越多,图像就越大。

结论

我会明确地为第一个解决scheme,因为它给你更多的灵活性,只要你使用Docker卷,你可以在不同的环境中保持你的改变,特别是如果你使用一些包pipe理器,如conan或vcpkg。

有关Docker / C ++映像的示例,请参阅解决scheme#1, 其中一个为我的泊坞窗图像

关于发行版,您可以使用COPY或ADD在一个非常简单的Dockerfile中构builddocker镜像,只需要项目所需的最小依赖项(最好是通过静态编译代码来实现)