2016-04-29 78 views
2

由于Docker Hub上的build time restrictions,我决定将耗时的自动构建的Dockerfile拆分为3个文件。 这些“子版本”中的每一个都在Docker Hub的时间限制内完成。在同一个Docker Hub存储库中链式自动构建

我现在同一个版本库中的以下设置:

| branch | dockerfile   | tag | 
| ------ | ------------------ | ------ | 
| master | /step-1.Dockerfile | step-1 | 
| master | /step-2.Dockerfile | step-2 | 
| master | /step-3.Dockerfile | step-3 | 

的图像按以下顺序互为基础:

  • step-1.DockerfileFROM ubuntu
  • step-2.DockerfileFROM me/complex-image:step-1
  • step-3.DockerfileFROM me/complex-image:step-2

一个单独的web应用程序使用Docker Hub提供的“构建触发器”URL触发构建step-1。 (其中添加了{"docker_tag": "step-1"}'负载)但是,Docker Hub不提供自动触发step-2,然后step-3后缀的方法。

问:如何自动按照各自的顺序触发以下构建步骤?(即触发step-2step-1完成之后,触发step-3step-2结束)

注:我不想为每个step-i然后使用泊坞集线器的连接它们设置不同的版本库“库链接。”我只是想链接标签在同一回购协议。

注意:到现在为止,我的解决方案是将Docker Hub Webhook连接到我制作的Web应用程序。当step-n完成时(即使用包含标记名称step-n的JSON调用我的Web应用程序的URL),Web应用程序使用“构建触发器”触发step-n+1。它按预期工作,但是,我想知道是否有一种“更好”的做事方式。

编辑:As requested by Ken Cochrane这里是initial Dockerfile以及它所使用的"build script"。我只是试图dockerize Cling。 (一个C++解释器)它需要编译llvm,clang和cling。正如你所期望的,根据不同的机器上,它需要几个小时的话,和泊坞枢纽允许“只” 2小时建立在最:)我在develop分支后来添加的(仍然是“子建”图像)分别构建整个事物的一部分。我不确定这里是否有进一步的优化。

此外,为了测试各种想法(和避免等待H-小时的结果)我有安装another repo具有类似的结构。(唯一的区别是,它的Dockerfile■不要做尽可能多的工作)

更新1:Option 5:如预期,从step-1.Dockerfilecurl已被忽略:

Settings > Build Triggers > Last 10 Trigger Logs 

| Date/Time     | IP Address  | Status | Status Description  | Request Body    | Build Request | 
| ------------------------- | --------------- | ------- | ------------------------ | -------------------------- | ------------- | 
| April 30th, 2016, 1:18 am | <my.ip.v4.addr> | ignored | Ignored, build throttle. | {u'docker_tag': u'step-2'} | null   | 

另一个问题这种方法是,它要求我把构建触发的(秘密)令牌在Dockerfile给大家看看:)(希望,多克尔中心有一个选项,以使它无效并重新生成另一个)

更新2:这里是my current attempt: 它基本上是一个Heroku -hosted的应用程序,具有APScheduler周期性“触发”启动该初始构建步骤和Flask网络挂接处理程序“传播”构建。 (即它有构建标签的有序列表,每次被webhook调用时,它会触发下一个构建步骤),我将在业余时间继续完成这个工作。 (欢迎提出建议:))

+0

忘记了触发标记。您应该能够从构建触发器页面重新生成一个新的。 –

+0

我认为你的用例是唯一的,所以你的自定义web应用程序来处理它,是最好的选择。随时接上github并链接到它,以便其他人可以查看并提供反馈。不要担心成为初学者,我们都开始在某个地方:) –

回答

1

构建需要多长时间?你可以发布你的Dockerfile吗?

选项1:找出自动化构建需要花费很长时间以查看为什么它不能及时完成。如果你在这里发布,我们可以看看你有什么可以做的优化。

选项2:您现在正在做什么,使用第三方应用程序以给定顺序触发构建。选项3:我不确定这是否适用于您,因为您使用的是相同的回购协议,但通常您会使用此功能的回购链接,然后链接它们,当一个完成后,下一个触发第一个。但既然你有一个回购,它将无法正常工作。

选项4:分解成多个回购,然后您可以使用回购链接。选项5:完全破解,最后的手段(不知道它是否会起作用)。你在Dockerfile的最后一行添加一个CURL语句,用下一步的给定标签发布到repo的构建触发器链接。如果下一步需要一个标签,则可能需要在下一步中添加休眠以等待推送完成推送到集线器。

老实说,最好的选择之一就是:你在做什么都应该能够在指定的时间内完成,你可能正在做一些我们可以优化的事情来使整个事情变得更快。如果你在规定的时间内进入,那么其他一切都不需要。

+0

感谢您的建议!我刚刚在我的问题中添加了相关链接。正如您将会发现的那样,由于构建必须编译相当大的C/C++代码库,因此没有太多需要优化的地方。如果选项2是可行的(即不被认为“太难看”),我可能会清理应用程序代码并将其放在github上。但我也想知道是否已经有类似/更好的产品。 (即由Docker专家而不是像我这样的初学者制作)正如我在我的帖子中所述,我不想使用选项3和/或4. – 865719

+0

我喜欢选项5 :)但由于Docker Hub的限制,我认为触发器将被忽略(_“...建立请求被扼杀,以便它们不会使系统超载......”__(我将继续尝试并返回给您) – 865719

+0

您可以在原始文章中查看我对选项5的更新,正如预期的那样,它不起作用(另外,它暴露了'Dockerfile'中的秘密标记) – 865719

1

最近不得不依赖链的构建同样的要求,并取得其使用泊坞云自动化这种方式建立:

  • 创建为需要构建的每个Dockerfile构建规则库。
  • 禁用依赖存储库中所有构建规则的Autobuild选项。
  • 添加一个名为每个目录hooks\post_push包含shell脚本Dockerfile与下面的代码有家属:

    for url in $(echo $BUILD_TRIGGERS | sed "s/,/ /g"); do 
        curl -X POST -H "Content-Type: application/json" --data "{ \"build\": true, \"source_name\": \"$SOURCE_BRANCH\" }" $url 
    done 
    
  • 每个仓库与家属添加一个名为BUILD_TRIGGERS到自动构建Build Environment Variable,并设置Value添加到每个依赖自动构建的构建触发器URL的逗号分隔列表。

使用该设置一推到源库将触发图像的生成,一旦它完成与被按下的post_push钩将被执行。在钩子中,对每个依赖的存储库构建触发器进行POST,其中包含正在请求主体中构建的分支或标记的名称。这将导致触发相关存储库的适当构建规则。

0

可以通过调整Docker Hub存储库中的Build Settings来完成此操作。

首先,为您的GitHub存储库的/step-1.Dockerfile创建自动构建,标记为step-1。这一个不需要任何特殊设置。

接下来,为您的GitHub存储库的/step-2.Dockerfile创建另一个自动构建,标记为step-2。在构建设置中,取消选中当激活时,构建将在推动时自动发生。还要添加一个存储库链接到me/step-1

step-3做相同的操作(将其链接到me/step-2)。

现在,当您推送到GitHub存储库时,它将触发步骤1来构建;当完成时,步骤2将建立,然后,步骤3将建立。

请注意,您需要等待上一阶段成功构建一次,然后才能向其添加存储库链接。

相关问题