链自动构建在相同的Docker Hub存储库中

问题描述 投票:3回答:3

由于Docker Hub上的build time restrictions,我决定将耗时的自动构建的Dockerfile拆分为3个文件。这些“子构建”中的每一个都在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-2结束后触发step-1。然后,在step-3完成后触发step-2

注意:我不想为每个step-i设置单独的存储库,然后使用Docker Hub的“存储库链接”链接它们。我只想在同一个回购中链接标签。

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

编辑:As requested by Ken Cochrane这里是initial Dockerfile以及它使用的"build script"。我只是想把Cling停靠。 (一个C ++解释器)它需要编译llvm,clang和cling。正如您所料,取决于机器,它需要几个小时才能完成,Docker Hub最多允许“仅”2小时构建:)我后来添加的“子构建”图像(仍然在develop分支中) )构建整个事物的一部分。我不确定这里还有进一步的优化。

此外,为了测试各种想法(并避免等待结果的h-hours),我设置了具有类似结构的another repo。 (唯一的区别是它的Dockerfiles不做那么多的工作)

更新1:关于Option 5:正如预期的那样,来自curlstep-1.Dockerfile被忽略了:

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中供所有人查看:)(希望Docker Hub可以选择使其无效并重新生成另一个)

更新2:这是my current attempt:它基本上是一个Heroku托管的应用程序,具有启动初始构建步骤的APScheduler周期性“触发器”,以及“传播”构建的Flask webhook处理程序。 (即它具有构建标记的有序列表。每次webhook调用它时,它都会触发下一个构建步骤)我将在业余时间继续处理它。 (建议欢迎:))

heroku web-applications docker build-automation dockerhub
3个回答
1
投票

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

选项1:了解自动构建需要花费多长时间,以了解为什么它没有及时完成。如果你在这里发布,我们可以看看你是否可以做任何优化。

选项2:您现在正在做什么,使用第三方应用程序以给定顺序触发构建。

选项3:我不确定这是否适合您,因为您使用相同的仓库,但通常您会使用repo链接来获取此功能,然后链接它们,当一个完成时,下一个触发第一个。但既然你有一个回购,它将无法运作。

选项4:将其分解为多个回购,然后您可以使用回购链接。

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

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


1
投票

最近对链依赖构建有相同的要求,并使用Docker Cloud自动构建以这种方式实现:

  • 使用需要构建的每个Dockerfile的构建规则创建存储库。
  • 禁用相关存储库中所有构建规则的Autobuild选项。
  • 在包含hooks\post_push的每个目录中添加一个名为Dockerfile的shell脚本,该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 Environment Variable
  • 对于具有依赖项的每个存储库,将名为BUILD_TRIGGERSValue添加到自动构建中,并将post_push设置为每个依赖自动构建的构建触发器URL的逗号分隔列表。

使用此设置,推送到根源存储库将触发根映像的构建,一旦完成并被推送,将执行/step-1.Dockerfile挂钩。在钩子中,对每个依赖的存储库构建触发器进行POST,其中包含在请求主体中构建的分支或标记的名称。这将导致依赖存储库的相应构建规则被触发。


0
投票

可以通过调整Docker Hub存储库中的Build Settings来实现。

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

接下来,使用标签step-2为您的GitHub存储库的me/step-1创建另一个Automated Build。在“构建设置”中,取消选中“激活时”,将在推送时自动进行构建。还要向step-3添加存储库链接。

me/step-2做同样的事情(将它连接到qazxswpoi)。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.