docker - 如何调试导致在不同工作站上从相同代码库构建的层不同的原因?
问题描述
在我们的开发工作流程中,我们构建镜像,将它们推送到注册表,然后在暂存集群中从它们部署服务。工作流程因大量图像推送而严重陷入困境,因为在不同工作站上由完全相同的代码库构建的层往往最终具有不同的哈希值。我们确实了解 docker 的工作原理(即一点变化,层发生变化;一层发生变化,所有后续层也发生变化),但我们仍然相信有很多层失效正在发生,我们所做的任何事情都无法解释到我们的代码库或依赖项,并且完全是由于在不同机器上执行的构建。原则上,我们的构建并不太依赖于平台(我们不会将任何东西编译成机器代码),而且这些机器无论如何都是 x86_64 linux 机器。
有哪些工具、策略和最佳实践可以帮助我们调试为什么会发生这种情况并可能缓解这种情况?
(重要提示:我们目前绝对负担不起的一个已知最佳实践是将构建过程转移到可能在云中的单个专用机器上。请不要建议此解决方案)。
解决方案
有哪些工具、策略和最佳实践可以帮助我们调试为什么会发生这种情况并可能缓解这种情况?
您已经命名了一些您需要处理的事情,这些事情已经指向这一点:
你想要的是一个可重复的构建。也就是说,相同的 VCS 版本正在创建相同的映像(假设基本映像也相同)。
- 检查使用中的基础镜像是否稳定(例如,您可以固定它们,并且它们不会在每次构建中更改,只是在打算更改它们时)。
- 时间戳。检查您放入的文件不仅与 repo 中的二进制文件相同,而且还用于元数据。
- 时间戳。在码头集装箱内。立即冻结以进行构建。不知道,这在很大程度上取决于构建中所做的事情。
您可以通过比较 tarball 及早验证事情。例如,从 VCS 导出一个 tarball 来构建,稍后从图像中导出它,看看有什么变化。用 tar 比较文件列表很容易,而且您通常会保留工件,因此比较多个运行/修订/构建也很容易。
我不知道 Docker / in Docker 中专门用于可重现构建的任何特定工具,因此我无法在这里提出任何建议。
我猜谷歌的构建工具应该支持可重现的构建,但我不知道是否。我知道他们有一个构建工具(已发布)。
推荐阅读
- typescript - 如果对象的布尔属性为真,Typescript 会阻止将对象添加到对象数组中
- javascript - 创建对象时函数关键字是可选的吗?
- spring-boot - 如何处理 Springboot 应用程序中的 401 未授权错误
- python-3.x - get_type_hints 使用本地类引发 NamError
- android - 安全存储的限制 - KeyChain 和 KeyStore
- c++ - rcpp和protobuf:Free宏的双重定义
- apache-nifi - 如何使用 NiFi 转换 Jsonfile 的字段?
- java - dataSnapShot.getChildren() 返回 null
- c++ - 为什么哈希模板专业化需要 result_type 和 argument_type?
- c++ - 当我使用 pango 标记时,如何从 MessageDialog 读取变量?