使用Docker构build编译的应用程序
我正在构build一个用C ++编写的服务器,并且想用docker-compose使用Docker来部署它。 什么是“正确的方式”呢? 我应该从Dockerfile调用make
还是手动构build,上传到某个服务器,然后从Dockerfile COPY
二进制文件?
我会这样做的方式是在你的容器外部运行你的构build,只复制构build的输出(你的二进制文件和任何必要的库)到你的容器中。 然后,您可以将容器上传到容器registry(例如,使用托pipe的容器或运行您自己的容器),然后从registry中将其拉到生产机器上。 因此,stream程可能如下所示:
- build立二进制
- testing/健全性检查二进制文件本身
- 使用二进制构build容器图像
- testing/健全性检查与二进制的容器图像
- 上传到容器registry
- 部署到登台/testing/ QA,从registry中拉
- 部署到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 ++应用程序有一个标准化的开发过程。 为了回答你的问题,我们现在这样做的方式是,将容器当作你的开发环境,并在团队中执行一系列的实践:
- 我们的代码库(configuration文件除外)总是位于共享卷上(在本地机器上)(在Git上版本化)
- 共享/依赖库和二进制文件等… 始终活在容器上
- 构build和testing容器,并提交图像之前干净的不需要的对象文件,库等…并确保
docker diff
变化是预期的 - 对环境(包括共享库)的更改/更新,相关性始终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的输出复制到图像并安装
-
RUN
或ENTRYPOINT
用于启动应用程序
文件夹结构如下所示:
. ├── 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
并查看错误