Docker中42层限制的原因是什么?

在不同的地方,我发现一个docker图片只能包含多达42层的信息。 这似乎是使用的AUFS文件系统的限制。

任何人都可以告诉我为什么这个限制存在,或有人有一些文件解释这一点?

这似乎主要由AUFS ( sfjro/aufs4-linux )施加。
见PR 50“在核心禁止超过42层”

嘿,出于好奇,这背后的详细理由是什么?
人们一直在问如何绕过42层的限制,我们一直告诉他们“等待设备映射器!” 所以…我们现在应该告诉他们什么?

我们目前还不能超过42层。 Devicemapper确实支持它,但是,如果将50层图像推送到registry,大多数人将无法使用它。 一旦我们支持超过42层AUFS,我们将启用此。

PR 66应该取消这个限制

这个线程报道:

42限制来自aufs代码本身。
我的猜测是,这是因为堆栈深度:如果将这些内核数据结构堆叠太深,可能会在某处触发溢出。 硬编码限制可能是避免这种情况的实用方法。

从Docker BP文档 :

最小化层数

您需要findDockerfile可读性(以及长期可维护性)与最小化其使用的层数之间的平衡。 对您使用的图层数量要保持战略性和谨慎。

他们还提供了如何避免太多层次的build议:

这样,你可以删除不再需要的文件,而不需要在图像中添加另一个图层

[..]

最后,要减less层次和复杂性,请避免频繁切换用户。


TL; DR:最小化层数的好处可以被归类为最小化小文件数量的好处,而是更less的大文件。 docker pull也快( 尝试下载1KB的2048个文件或2MB的文件 )。 并且具有较less的层次降低了图像的复杂度,因此具有可维护性。

至于42限制。 那么…我想他们必须拿出一个数字,他们select这个特定的;)