如何停止TeamCity每次重新构建Docker依赖项?

5
我有一个TeamCity构建项目,它将十几个Docker容器的构建版本参数化到docker-compose.yml模板中,因此为了从每个容器获取build_counter,我将它们设置为docker-compose构建作业中的快照依赖项。每个容器的Dockerfile和其他文件都在它们自己的BitBucket存储库中,并且它们具有适当文件的触发器。在docker-compose构建的快照依赖项中,我将它们设置为“如果存在合适的构建,则不运行新构建”,但它仍然尝试运行所有相关构建,即使它们各自的存储库中没有任何更改。
这使得本应该是非常简单和快速的构建变成了非常漫长的构建。而且经常会出现其中一个依赖构建失败并显示“无法收集更改:连接被拒绝”的情况,我怀疑这与TC试图同时访问所有这些不同的存储库有关。
有什么方法可以不触发每次运行docker-compose构建时的所有依赖项的构建吗?
编辑:
这里是我们的docker-compose.yml.j2的示例:http://termbin.com/b2xy 显然,我对其进行了消毒以供共享,我们真正的docker-compose模板列出了大约十几个服务。
这是一个服务的示例Dockerfile:http://termbin.com/upins

当所有仓库都在构建时,TC是否会显示任何仓库中的待处理更改? - bluescores
不,它们都显示“没有更改”。 - Isaac Freeman
你能分享一个 Dockerfile 吗?有一些命令会使生成的缓存失效,导致所有后续的命令重新运行而不是使用缓存。 - herm
我编辑了问题并包含了示例。 - Isaac Freeman
可能会有所帮助,很可能您已经阅读了文档。快照依赖关系。这里的某些内容解释了为什么组合构建配置不将任何Dockerfile构建配置计算为“合适”。 - bluescores
2个回答

0

与其每次更改构建的源代码(参数化的docker-compose.yml)并强制重新构建,您可以考虑独立构建容器并使用版本增量和标签对其进行标记。构建完成后将镜像存储在本地注册表中。使用docker-compose来满足您的运行时需求。docker-compose可以使用多个yaml文件,因此如果您需要其他图像来进行特定的构建,只需拉取所需的其他图像即可。对于生产环境,请使用另一个yaml文件来组合系统以运行。在Dockerfile中添加LABEL。请参阅http://label-schema.org//rc1/以获取适合您需求的一组标签。


我不确定我理解你的建议。目前,容器正在单独的TC项目中构建,但是docker-compose构建项目需要知道每个容器上次成功构建的build_counter,因此我们将它们设置为快照依赖项。你是在建议每个容器构建作业生成自己的docker-compose片段,然后使用“-f”选项将它们在运行时合并吗?另外,我编辑了问题以提供一些我们正在做的示例。 - Isaac Freeman
你的堆栈一开始不太清晰。我建议不要使用快照,因为它们随时可能会更改,从而每次都会导致构建(特别是在 package.json 依赖项方面),构建您的镜像并标记这些镜像,以便您可以依赖于注册表中的版本而不是其他构建。换句话说,解耦。 - bbaassssiiee
好的,但是如果我删除快照依赖项,我将无法从我的docker-compose构建中访问构建计数器变量(即%dep.MyProject_AServiceBuild.build.counter%)。是否有另一种引用这些变量的方法? - Isaac Freeman
我更新了我的答案,包括在Dockerfile中使用LABEL。 - bbaassssiiee
构建计数器变量应该是无关紧要的。您可以像使用第三方镜像一样使用标签从注册表中拉取镜像(但是,是的,您可以使用构建计数器来标记镜像)。在docker-compose-dev.yml中,您使用标签“latest”,运行测试并从注册表中使用curl DELETE删除不良镜像。 - bbaassssiiee
显示剩余9条评论

0

我知道这是一个老问题,但我最近遇到了这个问题,你不能做听起来合理的事情,即在不重新构建的情况下获取最新的绿色构建。这部分原因是Jetbrains设计的快照依赖关系的作用。

基本思想是依赖项用于代码的同步修订:也就是说,如果您在某个时间构建Compose,则需要使用该时刻所有依赖项的代码版本以及从那个时刻开始的所有代码,而不管是否发生了任何重大变化。

在我的例子中,总是会有变化,因为同一仓库用于许多项目,并且有不相关的更改,这些更改不会触发构建,但会使项目显得落后并导致构建。

如果您的依赖项未更改且未显示待处理的更改,则不应进行构建。在这种情况下,您需要勾选“如果有合适的构建,则不运行新构建”。 “强制修订同步”略微令人困惑。如果选中,它将找到与触发您的构建后第一个构建匹配的旧构建。如果未选中,则可以使用更新的构建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接