Dockerfile中的命令数

时间:2014-01-30 21:21:33

标签: docker

我注意到Dockerfile中的每一行都创建了一个单独的图像。创建的图像数量是否有限制?

我们应该尝试使用RUN cmd1 && cmd2 && cmd3的oneliner吗?

如果我们使用像Quay这样的服务会有什么不同?

谢谢!

2 个答案:

答案 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多个文件时减少潜在的图像数量。