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

P.J*_*sch 5 docker dockerfile

在不同的地方,我发现了一个信息,即泊坞窗映像最多只能包含42层。这似乎是使用的AUFS文件系统的限制。

谁能告诉我为什么存在此限制,或者有人有一些文档对此进行解释吗?

cow*_*tor 6

我开始怀疑没有任何这样的硬限制。

创建以下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))
Run Code Online (Sandbox Code Playgroud)

然后运行 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

编辑

thaJeztahDocker 的维护者,有这样的说法:

aufs 上的“42 层限制”适用于较旧版本的 aufs,但不应再如此。

但是,127 层的限制仍然存在。这是由于 Linux 对所使用的系统调用不接受超过 X 个参数的限制。

虽然这个限制可以在现代内核中提高,但它不是默认值,所以如果我们超过这个最大值,在一台机器上构建的图像可能无法在另一台机器上使用。

(见https://github.com/docker/docker.github.io/issues/8230


Auz*_*ias 2

来自Docker BP 文档

\n
\n

尽量减少层数

\n

您需要在可读性(以及长期可维护性)Dockerfile和最小化其使用的层数之间找到平衡。对所使用的层数要有策略和谨慎。

\n
\n

他们还就如何避免太多层给出了建议:

\n
\n

这样,您就可以在提取\xe2\x80\x99 后删除不再需要的文件,并且\xe2\x80\x99 不必在图像中添加另一个图层

\n

[..]

\n

最后,为了减少层次和复杂性,避免频繁地来回切换 USER。

\n
\n
\n

TL;DR:最小化层数的好处可以比作最小化小文件数量但减少大文件数量的好处。Adocker pull也更快(尝试下载 2048 个 1kB 的文件或一个 2MB 的文件)。更少的层数降低了图像的复杂性,从而降低了可维护性。

\n

至于42极限。嗯……我想他们必须想出一个数字,然后他们选择了这个特定的数字;)

\n