使用Docker构build编译的应用程序

我正在构build一个用C ++编写的服务器,并且想用docker-compose使用Docker来部署它。 什么是“正确的方式”呢? 我应该从Dockerfile调用make还是手动构build,上传到某个服务器,然后从Dockerfile COPY二进制文件?

我会这样做的方式是在你的容器外部运行你的构build,只复制构build的输出(你的二进制文件和任何必要的库)到你的容器中。 然后,您可以将容器上传到容器registry(例如,使用托pipe的容器或运行您自己的容器),然后从registry中将其拉到生产机器上。 因此,stream程可能如下所示:

  1. build立二进制
  2. testing/健全性检查二进制文件本身
  3. 使用二进制构build容器图像
  4. testing/健全性检查与二进制的容器图像
  5. 上传到容器registry
  6. 部署到登台/testing/ QA,从registry中拉
  7. 部署到prod,从registry中拉出

由于在生产部署之前进行testing非常重要,因此您需要testing与在生产环境中部署的完全相同的内容,因此,在构buildDocker映像之后,您不希望以任何方式提取或修改Docker映像。

我不会你打算在产品中部署的容器中运行这个构build,因为那么你的容器将会有各种你不需要在生产中不必要的附加构件(比如临时构build输出,工具等等)您的容器映像与您不会用于部署的东西。

我的build议是完全开发,build立和testing容器本身。 这确保了Docker的理念,即开发人员的环境与生产环境相同https://blog.newrelic.com/2016/06/20/docker-osx-mac/特别是在C ++应用程序中通常存在依赖与共享库/对象文件。

我不认为在Docker上开发,testing和部署C ++应用程序有一个标准化的开发过程。 为了回答你的问题,我们现在这样做的方式是,将容器当作你的开发环境,并在团队中执行一系列的实践:

  1. 我们的代码库(configuration文件除外)总是位于共享卷上(在本地机器上)(在Git上版本化)
  2. 共享/依赖库和二进制文件等… 始终活在容器上
  3. 构build和testing容器,并提交图像之前干净的不需要的对象文件,库等…并确保docker diff变化是预期的
  4. 对环境(包括共享库)的更改/更新,相关性始终logging在案,并与团队沟通。

我有困难自动化我们的构build与docker-compose我结束了使用docker build的一切:

三层build筑

运行 – >开发 – >构build

然后我将构build输出复制到“部署”映像中

运行 – >部署

四层玩:

  • 包含应用程序运行所需的任何软件包
    • 比如libsqlite3-0

发展

  • FROM <projname>:run
  • 包含构build所需的包
    • 例如g ++,cmake,libsqlite3-dev
  • Dockerfile执行任何外部构build
    • 例如,构buildboost-python3的步骤(不在包pipe理器仓库中)

build立

  • FROM <projname>:develop
  • 包含来源
  • Dockerfile执行内部构build(经常更改的代码)
  • 构build的二进制文件被复制出来,用于部署

部署

  • FROM <projname>:run
  • 构build的输出复制到图像并安装
  • RUNENTRYPOINT用于启动应用程序

文件夹结构如下所示:

 . ├── run │  └── Dockerfile ├── develop │  └── Dockerfile ├── build │  ├── Dockerfile │  └── removeOldImages.sh └── deploy ├── Dockerfile  └── pushImage.sh 

设置构build服务器意味着执行:

 docker build -f run -t <projName>:run docker build -f develop -t <projName>:develop 

每次我们进行构build时,都会发生这种情况:

 # execute the build docker build -f build -t <projName>:build # install build outputs docker build -f deploy -t <projName>:version # if successful, push deploy image to dockerhub docker tag <projName>:<version> <projName>:latest docker push <projName>:<version> docker push <projName>:latest 

我将人们引用到Dockerfiles中作为关于如何构build/运行/安装项目的文档

如果构build失败,并且输出结果不足以进行调查,我可以在<projname>:build运行/bin/bash并查看错误