我注意到Dockerfile中的每一行都创建了一个单独的图像。创建的图像数量是否有限制?
我们应该尝试使用RUN cmd1 && cmd2 && cmd3
的oneliner吗?
如果我们使用像Quay这样的服务会有什么不同?
谢谢!
答案 0 :(得分:15)
作为Alister said,如果您使用的是AUFS文件系统,则Docker镜像中的图层数有一个上限。 在Docker版本0.7.2中,限制被提升为127层(changelog)。
由于这是底层联合文件系统的限制(在AUFS的情况下),使用Quay或其他私有注册表不会改变结果。但是你可以使用不同的文件系统。
当前的替代文件系统是使用devicemapper
(请参阅CLI docs)。这些其他文件系统可能对层数有不同的限制 - 我认为devicemapper没有上限。
你是对的,通过在单个RUN语句中运行多个命令,可以减少层数。
或者,如果您确实需要大量图层来构建图像,则可以构建图像直到达到最大值,然后使用docker export
创建图像文件系统的非分层副本。然后docker import
将它再次变回图像,这次只有一层,然后继续构建。你失去了那段历史。
答案 1 :(得分:5)
有一个限制,42 - 显然是AUFS强加的硬限制。
通过将单个RUN
命令中的内容放入脚本,然后运行该脚本,可以有所避免。然后,您将得到一个更大的图像层,而不是要合并的一些较小的文件。较小的图像(具有多个RUN行)使初始测试更容易(因为RUNlist末尾的新添加可以重新使用前一个图像),因此通常等到Dockerfile稳定后再合并行。
通过添加目录已满,而不是多个单独的文件,您还可以在ADD
多个文件时减少潜在的图像数量。