Dockerfile中的命令数

Rez*_*a S 15 docker

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

我们应该尝试做一个oneliner RUN cmd1 && cmd2 && cmd3吗?

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

谢谢!

And*_*ndy 15

正如Alister所说,如果您使用的是AUFS文件系统,则Docker镜像中的图层数量会有一个上限.在Docker版本0.7.2中,限制被提升到127层(更改日志).

由于这是底层联合文件系统的限制(在AUFS的情况下),使用Quay或其他私有注册表不会改变结果.但您可以使用不同的文件系统.

使用当前的替代文件系统devicemapper(请参阅CLI文档).这些其他文件系统可能对层数有不同的限制 - 我认为devicemapper没有上限.

你是对的,通过在单个RUN语句中运行多个命令,可以减少层数.

或者,如果您确实需要大量图层来构建图像,则可以构建图像直到达到最大值,然后用于docker export创建图像文件系统的非分层副本.然后docker import将它再次变回图像,这次只有一层,然后继续构建.你失去了历史.


Ali*_*man 5

有一个限制,42 - 显然是AUFS强加的硬限制.

通过将单个RUN命令中的内容放入脚本,然后运行该脚本,可以有所避免.然后,您将得到一个更大的图像层,而不是要合并的一些较小的文件.较小的图像(具有多个RUN行)使初始测试更容易(因为RUNlist末尾的新添加可以重复使用前一个图像),因此通常等到Dockerfile稳定后再合并行.

ADD通过添加目录已满,而不是多个单独的文件,您还可以减少大量文件时潜在的图像数量.