由于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.Dockerfile
:FROM ubuntu
step-2.Dockerfile
:FROM me/complex-image:step-1
step-3.Dockerfile
:FROM 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。 (唯一的区别是它的Dockerfile
s不做那么多的工作)
更新1:关于Option 5:正如预期的那样,来自curl
的step-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调用它时,它都会触发下一个构建步骤)我将在业余时间继续处理它。 (建议欢迎:))
构建需要多长时间?你可以发布你的Dockerfile吗?
选项1:了解自动构建需要花费多长时间,以了解为什么它没有及时完成。如果你在这里发布,我们可以看看你是否可以做任何优化。
选项2:您现在正在做什么,使用第三方应用程序以给定顺序触发构建。
选项3:我不确定这是否适合您,因为您使用相同的仓库,但通常您会使用repo链接来获取此功能,然后链接它们,当一个完成时,下一个触发第一个。但既然你有一个回购,它将无法运作。
选项4:将其分解为多个回购,然后您可以使用回购链接。
选项5:完全黑客,最后的手段(不确定它是否会起作用)。您可以在Dockerfile的最后一行添加CURL语句,以便在下一步中使用给定标记发布到repo的构建触发器链接。如果下一步需要一个标记,则可能需要在下一步中添加休眠以等待推送完成推送到集线器。
老实说,最好的选择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_TRIGGERS
的Value
添加到自动构建中,并将post_push
设置为每个依赖自动构建的构建触发器URL的逗号分隔列表。使用此设置,推送到根源存储库将触发根映像的构建,一旦完成并被推送,将执行/step-1.Dockerfile
挂钩。在钩子中,对每个依赖的存储库构建触发器进行POST,其中包含在请求主体中构建的分支或标记的名称。这将导致依赖存储库的相应构建规则被触发。
可以通过调整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步将构建。
请注意,您需要等待上一个阶段成功构建一次,然后才能向其添加存储库链接。