在不同的地方,我发现了一个码头图像最多只能包含42层的信息。这似乎是使用过的AUFS文件系统的限制。
有人可以告诉我为什么存在此限制,或者是否有人有一些文件解释这个?
答案 0 :(得分:1)
这似乎主要由AUFS(sfjro/aufs4-linux
)强加
见PR 50 "Prohibit more than 42 layers in the core "
嘿,出于好奇,这背后的详细理由是什么? 人们一直在问如何绕过42层限制,我们总是告诉他们“等待设备映射器!”所以...我们现在应该告诉他们什么?我们目前还不允许超过42层。 Devicemapper确实支持它,但是,如果你将50层图像推送到注册表,大多数人将无法使用它。一旦我们为AUFS支持超过42层,我们就会启用此功能。
PR 66应该删除该限制
This thread报道:
42限制来自aufs代码本身 我的猜测是因为堆栈深度:如果你将这些内核数据结构堆叠得太深,你可能会在某处触发溢出。硬编码限制可能是避免这种情况的实用方法。
答案 1 :(得分:0)
最小化层数
您需要在
Dockerfile
的可读性(以及长期可维护性)之间找到平衡,并尽量减少它使用的层数。对您使用的图层数量保持战略性和谨慎。
他们还就如何避免过多层提出建议:
通过这种方式,您可以删除提取后不再需要的文件,也不必在图片中添加其他图层
[..]
最后,为了减少层次和复杂性,请避免经常来回切换USER。
TL; DR:最小化层数的好处可以比作最小化小文件数量的好处,而不是更小的文件。 docker pull
也更快(尝试下载20个1kB的文件或一个2MB的文件)。并且具有较少的层会降低图像的复杂性,从而降低可维护性。
至于42
限制。嗯......我猜他们必须拿出一个号码然后选择这个特别的号码;)
答案 2 :(得分:0)
我开始怀疑没有这么硬的限制。
创建以下python脚本,并将其命名为“ makeDockerfile.py”
with open("Dockerfile", "w") as file:
file.write("from alpine:3.8\n")
for i in range(0, 201):
file.write("run echo {i}\n".format(i=i))
然后运行
python makeDockerfile.py && docker build --tag manylayer . && docker run -it manylayer /bin/sh
您会看到您正在运行一个包含200层以上的工作容器。
(注意,这已在linux上的linux容器中进行了测试)
请注意,这并不意味着必须支持这么多的层,只是在某些情况下是可能的。
实际上,我已经看到容器失败的原因远远少于42层,并且删除任意层似乎可以解决该问题。 (请参见https://github.com/docker/for-win/issues/676#issuecomment-462991673)
编辑:
Docker的维护者 thaJeztah
对此有这样的看法:
The "42 layer limit" on aufs was on older versions of aufs, but should no longer be the case.
However, the 127 layer limit is still there. This is due to a restriction of Linux not accepting more than X arguments to a syscall that's used.
Although this limit can be raised in modern kernels, it's not the default, so if we'd go beyond that maximum, an Image built on one machine may not be usable on another machine.