Docker C ++开发和CI

时间:2017-03-12 13:32:48

标签: docker

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

问题如下:

  • 如果是CI,何时应该在 docker build docker run 编译项目?
  • 如果在docker构建中,如何将开发容器中的已编译项目放​​入产品容器中?因为在docker构建阶段你无法连接VOLUMES。
  • 在C ++开发中是否有使用docker的方法?

也许我根本没有正确的方向,例如,开发容器应该包含eclipse?关于CI怎么样呢?我找到的所有教程通常都是指PHP,没有编译阶段。

1 个答案:

答案 0 :(得分:5)

您使用Docker和C ++有不同的模式。

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

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

亲:

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

缺点:

  • 每个开发人员/ QA必须自己配置docker容器的启动(使用 docker-compose 来救援)

在项目范围内构建Docker镜像

在这种情况下,您将所有需求和代码封装在docker镜像中,这意味着您必须在每次代码更改时重建它,删除以前运行的容器,在CI服务器中下载新映像等等。 / p>

优点:

  • 非常专业的图像 - 一个泊坞窗图像 - >代码的一个快照
  • 更快与QA分享

缺点:

  • 巨大的Docker图像
  • 每次代码更改时都必须触发 docker build ,这会运行编译等。 - >慢
  • 更新更复杂/图层太多

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

<强>结论

我会明确地选择第一个解决方案,因为它为您提供了更大的灵活性,只要您使用Docker Volumes,就可以在不同环境中保持更改,特别是如果您使用某些包管理器(如conan或vcpkg)。

有关Docker / C ++图像的示例,请遵循解决方案#1,请参阅:one of my docker images

关于版本,您可以使用COPY或ADD在极其简单的Dockerfile中构建您的docker镜像,只需要项目所需的最小依赖项(最好通过静态编译代码来实现)