在Continuous Delivery管道中使用Docker的最佳方法是什么?
构建人工制品应该是Docker Image而不是Jar / War吗?如果是这样,那将是如何工作的 - 我正在努力研究如何在开发中(在笔记本电脑上)无缝地使用Docker,然后让CI服务器使用相同的基本映像来构建工件。
答案 0 :(得分:12)
当然,有多种最佳实践和许多方法可以解决这个问题。我发现成功的一种方法如下:
通过这种方法,我们还能够将本地进程(数据库等)作为Docker容器运行。这些容器当然基于与生产中相同的图像,也可以在开发机器上开发。本地开发环境和生产环境之间唯一真正的区别是操作系统。开发机器通常运行Mac OS X / Boot2Docker,并在Linux上运行。
答案 1 :(得分:2)
是的,您应该从jar / war文件转换为图像作为构建工件。 @wassgren描述的过程应该运行良好,但我发现以下内容更适合我们的用例,特别是对于开发:
1-制作基本图像。看起来你是一个java商店,举个例子,假装你的基本图像是FROM ubuntu:14.04
并安装jdk和一些更常见的库。我们称之为myjava
。
2-在开发过程中,使用fig在本地调出容器并将您的开发代码安装到正确的位置。 Fig使用myjava
基本图像,并不关心Dockerfile。
3-构建项目以进行部署时,它使用Dockerfile,并在某处将COPY
代码/构建工件放到正确的位置。然后,该图像被适当标记并部署。
答案 2 :(得分:2)
要遵循的简单步骤。
1)将jenkins安装在容器中
2)在同一容器中安装框架工具。(我使用SBT)。
3)在jenkins中创建一个带有必要插件的项目,以集成来自gitlab的数据,并将所有jar文件构建为压缩格式(例如 build.tgz )。
4)这个build.tgz可以移动到任何地方并被触发,但它应该满足所有的环境依赖性(例如说它需要mysql)。
5)现在我们创建一个基本环境映像(在我们的例子中安装了mysql)。
6)触发每个构建后,我们应该在服务器上触发一个dockerfile,它将build.tgz和环境图像结合起来。
7)现在我们有了build.tgz以及它的环境。这张图片应该被推入注册表。这是我们的最终图片。它是便携式的,可以部署在任何地方。
8)最终图像可以保存在具有必要mountppoints的容器上以获取输出,并且可以通过在dockerfile中提及 entrypoint 命令来触发脚本(script.sh)。
9)此script.sh将位于图像(基本图像)内部,并将根据我们的目的进行配置。
10)在装入此容器之前,您需要停止以前运行的容器。
重要说明:
每次构建时都会创建一个映像,并将其存储在注册表中。 因此可以重复使用。此图像可以推送到主生产服务器并可以触发。 这有助于每次都保持一个干净的环境,因为我们正在使用基本图像。
答案 3 :(得分:1)
您还可以使用Bamboo和Docker创建稳定的CD管道。 Bamboo Docker集成既有构建代理形式,也有应用程序中的捆绑任务。您可能会发现此文章有用:http://blogs.atlassian.com/2015/06/docker-containers-bamboo-winning-continuous-delivery/
您可以使用该任务构建可在其他环境中使用的Docker镜像,也可以将应用程序部署到容器中。
祝你好运!