Docker C++开发和CI

Mak*_*mov 7 docker

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

问题如下:

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

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

mad*_*uci 6

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

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

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

优点:

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

缺点:

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

在项目范围内构建Docker镜像

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

优点:

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

缺点:

  • 巨大的Docker图像
  • 一个码头工人的构建必须每一次触发了您的代码修改,运行编译等- >慢
  • 更新更复杂/层次太多

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

结论

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

有关Docker/C++映像的示例,请按照解决方案#1,查看:我的一个docker映像

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

  • Docker多阶段构建简化了很多东西:https://docs.docker.com/engine/userguide/eng-image/multistage-build/ (4认同)